2014-06-12 49 views
15

我一直在看C#6中的空傳播運算符,並試圖使其與dynamic類型的變量一起工作,但沒有成功。 考慮下面的代碼,它編譯,但CLR在運行時將空傳播應用於動態對象時拋出AccessViolationException空傳播算子和動態變量

class SomeType 
{ 
    public object SomeProperty { get; set; } 

    static void Main() 
    { 
     var obj = new SomeType() { SomeProperty = "ABCD" }; 

     var p1 = ((dynamic)obj).SomeProperty; //OK, p1 is set to "ABCD" 
     var p2 = ((dynamic)obj)?.SomeProperty; //AccessViolationException 

     Console.ReadLine(); 
    } 
} 

起初我以爲這可能是一個錯誤,但轉念一想約struct秒。通常,您不能將?.運算符應用於值類型變量(因爲它不能爲空)。但是您可以將它投射到dynamic然後應用操作員。所以我將SomeType更改爲struct,並得到相同的例外。

問題是,動態變量的空傳播總是會引發異常,因爲底層對象可能是一個值類型?

無論如何,AccessViolationException是非常醜陋的,當你運行代碼時你會得到相同的嗎?

+0

只是在黑暗中刺:如果你讓'SomeType'' public'而不是'internal'會發生什麼? –

+0

@ChrisSinclair輸出是一樣的 – nosalan

+3

如果你對你的exe運行'PEVerify.exe',它會報告任何錯誤嗎? – latkin

回答

3

AccessViolationException幾乎總是編譯器錯誤或錯誤的PInvoke調用。