簡體   English   中英

獲取對象引用未設置為對象實例的空引用對象的類型

[英]Get type of null reference object for Object reference not set to an instance of an object

自從我開始編程以來,這個問題一直困擾着我,而不是“我的代碼為空”在哪里,而是特別有沒有辦法從異常中獲取為空的對象的類型?

失敗了,誰能提供一篇博客文章或msdn文章來解釋.NET Framework不提供(或不提供)這些詳細信息的原因?

嗯...因為它為空。

在C#中,引用類型是指向某物的指針。 空指針不指向任何東西。 您在問,“如果指向某事物,它將指向哪種類型的事物”。 這就像拿一張白紙,然后問:“如果上面寫着什么,這會怎么說呢?”

更新:如果框架不知道空指針的類型,就不能知道它應該是什么類型? 好吧,可能吧。 再說一次,可能不會。 考慮:

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

除非您在MyClass中覆蓋它,否則GetHashCode是在System.Object中定義的。 您是否應該抱怨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");
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM