空传播算子和动态变量

我一直在研究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调用。