gpt4 book ai didi

c# - 编译时错误和无法访问的代码

转载 作者:太空狗 更新时间:2023-10-29 18:04:45 26 4
gpt4 key购买 nike

好的,考虑下面的代码:

private const int THRESHHOLD = 2;

static void Main(string[] args)
{
string hello;

if (THRESHHOLD > 1) return;
Console.WriteLine(hello);
}

令人惊讶的是,这段代码不会抛出“使用未分配的局部变量‘hello’”编译时错误。它只是给出警告“检测到无法访问的代码”。

即使代码无法访问,它仍然是编译时错误,我认为正确的做法是抛出编译时错误。如果我要执行以下操作:

private const int THRESHHOLD = 2;

static void Main(string[] args)
{
string hello;

if (THRESHHOLD > 1) return;
hello.LMFAO();
}

果然,我得到一个“'string'不包含'LMFAO'的定义并且没有扩展方法'LMFAO'接受类型'string'的第一个参数可以找到(你错过了一个使用指令或程序集引用?)“编译时错误。

为什么使用未分配的变量不一样?

编辑 更改了 const 变量,因此它不那么让人分心。我认为很多人都忽略了问题的要点,即根据哪种情况,编译时错误优先于无法访问的代码。

最佳答案

James Michael Hare 的回答给出了de jure 的解释:局部变量明确赋值的,因为代码是不可访问的,所有局部变量都是在不可访问代码中明确赋值的。换句话说:如果有办法观察未初始化局部变量的状态,则程序只是一个错误。在你的程序中没有办法观察本地,因此这不是错误。

现在,我注意到编译器不需要无限聪明。例如:

void M()
{
int x = 0;
int y;
if (x + 0 == x) return;
Console.WriteLine(y);
}

你知道我都知道方法的最后一行是不可达的,但编译器并不知道,因为可达性分析器不知道零是整数的加法恒等式。编译器认为最后一行可能是可达的,因此给出错误。

有关在编程语言中设计可达性和明确分配分析器方面的更多信息,请参阅我关于该主题的文章:

http://blogs.msdn.com/b/ericlippert/archive/tags/reachability/

http://blogs.msdn.com/b/ericlippert/archive/tags/definite+assignment/

我注意到虽然没有人回答更深层次的问题,即为什么在无法访问的代码中应该抑制错误?正如您所注意到的,我们在无法访问的代码中给出了其他语义分析错误。

要考虑该决定的利弊,您必须首先考虑为什么有人会拥有无法访问的代码。它要么是有意无法访问,要么是无意无法访问。

如果它无意中无法访问,则该程序包含错误。该警告已经提醒人们注意主要问题:代码无法访问。如果存在无法访问的代码,则方法的控制流有一些严重错误。很有可能开发人员将不得不对该方法的控制流程进行重大更改;我们对无法访问的代码所做的任何局部变量分析都可能是误导性的噪音。让开发人员修复代码,以便所有内容均可访问,然后我们将对现在可访问的代码进行分析,以找出与控​​制流相关的错误。

如果无法访问的代码无法访问是因为开发人员有意它无法访问,那么他们正在做这样的事情的可能性很大:

// If we can Blah, then Frob. However, if we cannot Blah and we can Baz, then Foo.
void M()
{
int y;
// TODO: The Blah method has a bug and always throws right now; fix it later.
if (false /* Blah(out y) */ )
{
Frob(y);
}
else if (Baz(out y))
{
Foo(y);
}
}

Frob(y) 应该是这个程序中的一个错误吗?

关于c# - 编译时错误和无法访问的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9416693/

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