获取Object引用的null引用对象的类型,而不是设置为对象的实例

时间:2010-09-08 00:43:25

标签: c# .net nullreferenceexception

自从我开始编程以来,这个问题一直让我烦恼,而不是“我的代码在哪里为空”但具体是否有任何方法可以从异常中获取null的对象类型?

如果不这样,有人可以提供博客文章或msdn文章,解释.NET Framework没有(或不能)提供这些细节的原因吗?

1 个答案:

答案 0 :(得分:4)

嗯...因为它是空的。

在C#中,引用类型是指向某事物的指针。空指针不指向任何东西。你在问,“如果它指的是某种东西,这指的是什么类型的东西”。这有点像得到一张白纸,然后问道:“如果上面写有什么东西会怎么说?”

UPDATE:如果框架不能知道空指针的类型,它不知道它应该是什么类型的?好吧,它可能。然后,它可能不会。考虑:

 MyClass myobj = null;
 int hash = myobj.GetHashCode();

除非你在MyClass中覆盖它,否则在System.Object中定义了GetHashCode。你应该得到myobj需要成为System.Object的投诉吗?现在,当我们检查自己时,我们可以完全自由地指定所需的类型。

  SomeFunc(MyClass myparam)
  {
       if (myparam == null)
           throw new ArgumentNullException("myparam must be a MyClass object");
  }

但现在我们讨论的是应用程序代码,而不是CLR代码。这让你“真实”的问题“人们为什么不写更多信息性的异常消息?”,正如我们在这里所说的那样“主观和论证”

因此,您基本上希望系统级异常知道仅在应用程序级别知道的类型信息,这是我们需要通信的方式。类似的东西:

  SomeFunc(MyClass myparam)
  {
       if (myparam == null)
           throw new ArgumentNullException("myparam", typeof(MyClass));
  }

但这并不是真的会给我们买单,如果你真的想要它,你可以自己写一下:

  public class MyArgumentNullException : ArgumentNullException
  {
      public MyArgumentNullException(string name, Type type) 
          :base(name + "must be a " + type.Name + " object");
  }