gpt4 book ai didi

c# - Visual Studio 空引用警告 - 为什么没有错误?

转载 作者:太空狗 更新时间:2023-10-29 22:25:03 24 4
gpt4 key购买 nike

我注意到 Visual Studio 有一些特别之处。首先,尝试在函数中的某处键入此 (C#):

class Foo  
{
public void Bar()
{
string s;
int i = s.Length;
}
}

现在,它会立即将 s.Length 中的 s 标记为错误,表示“Use of unassigned local variable 's'”。另一方面,试试这段代码:

class Foo  
{
private string s;
public void Bar()
{
int i = s.Length;
}
}

它将编译,并在 private string s 中的 s 下划线并带有警告,说“Field 'Foo.s' is never assigned to, and将始终具有其默认值 null"。

现在,如果 VS 如此聪明并且知道 s 将始终为 null,为什么在第二个示例中获取它的长度不会出错?我最初的猜测是,“如果编译器根本无法完成它的工作,它只会给出一个编译错误。因为代码在技术上运行只要你从不调用 Bar(),它只是一个警告。”除了第一个例子使解释无效之外。只要您从不调用 Bar(),您仍然可以无错误地运行代码。那么给出了什么?只是疏忽,还是我遗漏了什么?

最佳答案

第一个示例(错误)是编译器的 definite-assignment 的示例跟踪,并且仅适用于局部变量。由于上下文有限,编译器对这种情况有严密的把握。请注意,s 不是 null,它是未定义的。

在第二个示例中,s 是一个字段(默认为空)。没有编译器错误,但它总是会在运行时被捕获。这种特殊情况可能会被捕获,但这种错误通常不会被编译器检测到。
例如,您可以添加一个方法 Bar2() 将字符串分配给 s 但在 Bar() 之后调用它,或者不在全部。这会消除警告但不会消除运行时错误。

所以这是设计使然。

关于c# - Visual Studio 空引用警告 - 为什么没有错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1413210/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com