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;
}
我是否錯過了一些非常明顯的東西?或者這是動態的限制嗎?如果是後者,是否有人知道這個的根本原因?
是啊,我注意到!= null的作品,但在想這裏玩的內部機制。在我看來,cli知道這是一個Guid? (儘管它是動態類型的)。是否有一個原因,它不會自動執行演員,然後嘗試評估一個名爲動態的屬性(這可能是另一個問題) – Kolichikov
是什麼讓你認爲它知道它是一個「Guid」?它不是。 'dynamic'基於值的運行時類型,除了這裏沒有值外,因爲''''''''Guid?'被裝箱成真正的''''動態''。 – svick
當在動態實例中輸入debug和設置Watch時,VS仍然能夠確定MyGuid的類型是'System.Guid?',並且我認爲這也可以用於CLI(否則,VS得到這些信息?) – Kolichikov