他の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;
}
私は本当に明白な何かを欠いていますか?それとも、これは動的の限界ですか?それが後者の場合、誰もこれの根本的な理由を知っていますか?
いや、私は気づいた!= nullは働いていますが、ここで遊んでいる内部メカニズムについて疑問を抱いていました。これは私がGuidであることを知っているようです。 (たとえそれが型付き動的であっても)。動的に呼び出されるプロパティを評価しようとする前に自動的にキャストを実行しない理由がありますか(これは別の質問かもしれません) – Kolichikov
あなたはそれが 'Guid'だと思いますか?それはしません。 faux-'null'' Guid?は本当の' null'''動的 ''に囲まれているので、 'dynamic'は値の実行時の型に基づいています。 – svick
ダイナミックインスタンスでデバッグを開始し、ウォッチを設定すると、VSはMyGuidが 'System.Guid? '型であることを確認できますが、これもCLIで使用できると仮定しました(そうでなければ、VSその情報を取得しますか?) – Kolichikov