空传播算子和动态变量
我一直在研究C#6中的零传播运算符,并尝试使用dynamic
类型的变量,但没有成功。 考虑下面的代码,它会编译,但是当将null传播应用于动态对象时,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(); } }
起初我认为这可能是一个bug,但后来我想到了struct
。 通常你不能申请?.
运算符到值类型变量(因为它不能为null)。 但是您可以将其转换为dynamic
,然后应用运算符。 所以我将SomeType
更改为struct
并得到了相同的exception。
问题是,通过设计,动态变量的空传播总是会抛出exception,因为底层对象可能是值类型?
无论如何, AccessViolationException
都非常丑陋,在运行代码时是否获得相同的内容?
AccessViolationException几乎总是编译器错误或格式错误的PInvoke调用。