【发布时间】:2015-09-10 20:03:19
【问题描述】:
下面的代码编译没有问题。很明显_dependency 将永远是null,所以不可能以任何方式使用它(除了评估它) - 是吗?为什么编译器没有意识到这一点而失败了?
public class MyClass
{
private readonly MyDependency _dependency;
public MyClass()
{
_dependency.MyMethod();
}
}
需要明确的是,我知道上面的代码是错误的代码,这是开发人员的错 - 但任何其他编译时错误也是如此。我原以为编译器会抛出 use of unassigned variable 类型的错误。
为什么要编译?我是否不知道可以使用这样的null 对象的场景?
编辑:
确认一下 - 我不希望依靠编译器来检查写得不好的代码 - 我很欣赏,从语法上讲,这绝对没问题。我的问题确实是双重的,是否有一种我不知道的情况可能会使这段代码执行得很好。第二个问题是 - 如果它已经处理了use of unassigned variable 错误,为什么不会检测到这样的问题?有什么区别?
【问题讨论】:
-
MyDependency是声明为类还是结构? -
这会导致运行时错误。属性(与局部变量不同)分配了默认值。所以没有编译时错误
use of unassigned variable -
假设
MyDependecy有一个名为MyMethod的方法,代码没有问题。检查对象是否已初始化不是编译器的工作。这是在运行时完成的,或者使用第三个工具来提示(如 Resharper)。 -
想象
MyMethod将是扩展方法(当然,它们还没有在旧的 C#1-days 中引入)。编译这个调用MyDependency.MyMethod(null)的代码会被编译,不是吗? -
resharper 之类的工具可以发现这种情况并发出警告。但这只是警告。这可能是真的,也可能不是。如果编译器在编译时抛出运行时异常,编译器可能会出错。此代码有效的原因可能有很多。多线程、反射、使用非托管库或托管库等......
标签: c# compiler-errors null