2016-09-15 27 views
2

他のNullReferenceExceptionと実行時バインドに関する質問を検索しましたが、これに対する回答は見つかりませんでした。Nullable型のヌル参照でランタイムバインディングを実行できません

基本的には、以下のコードがあります。あなたはそれを期待するとして、Falseを返すManipulateConcrete方法が、

をスロー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です。 dynamicnullインスタンス上のどのようにプロパティにアクセスするのかわからないので、スローします。

この問題を解決する一つの方法ではなく.HasValueを使用しての、nullと比較することです:

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

別のオプションは、Guid?にキャストしてdynamicを取り除くために次のようになります。

Guid? guid = myClass.MyGuid; 

Console.WriteLine(guid.HasValue); 
+0

いや、私は気づいた!= nullは働いていますが、ここで遊んでいる内部メカニズムについて疑問を抱いていました。これは私がGuidであることを知っているようです。 (たとえそれが型付き動的であっても)。動的に呼び出されるプロパティを評価しようとする前に自動的にキャストを実行しない理由がありますか(これは別の質問かもしれません) – Kolichikov

+0

あなたはそれが 'Guid'だと思いますか?それはしません。 faux-'null'' Guid?は本当の' null'''動的 ''に囲まれているので、 'dynamic'は値の実行時の型に基づいています。 – svick

+0

ダイナミックインスタンスでデバッグを開始し、ウォッチを設定すると、VSはMyGuidが 'System.Guid? '型であることを確認できますが、これもCLIで使用できると仮定しました(そうでなければ、VSその情報を取得しますか?) – Kolichikov

関連する問題