2016-09-15 56 views
2

因此,我搜索了其他NullReferenceException和運行時綁定問題,但無法找到此答案。無法在可空類型的空引用上執行運行時綁定

基本上,我有下面的代碼。無法執行:ManipulateConcrete返回False,正如你所期望它,但該方法Manipulate拋出

「Microsoft.CSharp.RuntimeBinder.RuntimeBinderException」發生在 System.Core.dll

附加信息的方法運行時對空結合 參考

代碼:

class Program 
    { 
     static void Main(string[] args) 
     { 
      var myClassInstance = new MyClass() { MyGuid = null }; 

      ManipulateConcrete(myClassInstance); 
      Manipulate(myClassInstance); 
      Console.ReadLine(); 
     } 

     static void Manipulate(dynamic myClass) 
     { 
      Console.WriteLine(myClass.MyGuid.HasValue); 
     } 

     static void ManipulateConcrete(MyClass myClass) 
     { 
      Console.WriteLine(myClass.MyGuid.HasValue); 
     } 

    } 

    class MyClass 
    { 
     public Guid? MyGuid; 
    } 

我是否錯過了一些非常明顯的東西?或者這是動態的限制嗎?如果是後者,是否有人知道這個的根本原因?

回答

2

使用dynamic時,不考慮靜態類型。因此,在Manipulate內,myClass.MyGuid的值爲null,輸入爲dynamic。並且dynamic不知道如何訪問null實例上的任何屬性,因此會拋出。解決這個問題

一種方法是用null比較,而不是使用.HasValue,:

Console.WriteLine(myClass.MyGuid != null); 

另一種選擇是的話,被鑄造Guid?擺脫dynamic

Guid? guid = myClass.MyGuid; 

Console.WriteLine(guid.HasValue); 
+0

是啊,我注意到!= null的作品,但在想這裏玩的內部機制。在我看來,cli知道這是一個Guid? (儘管它是動態類型的)。是否有一個原因,它不會自動執行演員,然後嘗試評估一個名爲動態的屬性(這可能是另一個問題) – Kolichikov

+0

是什麼讓你認爲它知道它是一個「Guid」?它不是。 'dynamic'基於值的運行時類型,除了這裏沒有值外,因爲''''''''Guid?'被裝箱成真正的''''動態''。 – svick

+0

當在動態實例中輸入debug和設置Watch時,VS仍然能夠確定MyGuid的類型是'System.Guid?',並且我認爲這也可以用於CLI(否則,VS得到這些信息?) – Kolichikov

相關問題