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
是非常醜陋的,當你運行代碼時你會得到相同的嗎?
只是在黑暗中刺:如果你讓'SomeType'' public'而不是'internal'會發生什麼? –
@ChrisSinclair輸出是一樣的 – nosalan
如果你對你的exe運行'PEVerify.exe',它會報告任何錯誤嗎? – latkin