自从我开始编程以来,这个问题一直让我烦恼,而不是“我的代码在哪里为空”但具体是否有任何方法可以从异常中获取null的对象类型?
如果不这样,有人可以提供博客文章或msdn文章,解释.NET Framework没有(或不能)提供这些细节的原因吗?
答案 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");
}