C#编译器相关对象引用未设置为对象的实例

时间:2012-11-29 11:53:52

标签: c# compiler-errors compiler-warnings

  

可能重复:
  Is there a reason why NullReferenceException does not give the name of the variable?

为什么即使像C#或Java这样的高级语言也无法轻松提供一种机制来查找哪个对象类型和实例(变量)为空?我们是否需要为此编写自定义逻辑。

 ex:   SampleClass sc = null;
       sc.SomeMethod();

我想说“SampleClass类型的对象sc为空”而不是一个天真的异常消息“对象引用未设置为对象的实例。”

2 个答案:

答案 0 :(得分:2)

这里的术语值得清楚。 sc不是一个对象,它是一个变量。变量的值是一个引用。引用可以为null,也可以是对实际对象的引用。

现在,为什么它不像听起来那么简单......

在此代码中:

sc.SomeMethod();

......有两个操作:

  • sc的值加载到执行堆栈
  • 通过执行堆栈上的引用执行SomeMethod

这是第二次失败的操作,并且该操作确实没有“知道”第一次操作。

当涉及更多操作时会变得更糟。怎么样:

Foo().Bar().SomeMethod()

在这种情况下,您希望异常显示什么?

就我个人而言,我很少发现难以解决异常的来源 - 行号通常会非常清楚,而清除的情况通常恰好是有一个很长的表达,无论如何都不能轻易地给出一个单一的答案。

我想CLR /编译器可以可能同意一个额外的表,比如行号映射,它表示“对于IL指令X,执行堆栈的顶部来自带有诊断消息Y“的表达式。感觉它会非常麻烦 - 而且正如我所说,它不应该给你带来太多麻烦。

答案 1 :(得分:0)

因为在大多数情况下并不那么简单。

以此方法为例:

public int Foo(string bar)
{
    return bar.Length;
}

bar可以是null,具体取决于运行时只知道的因素。编译器无法验证这一点。