我一直在研究C#6中的null-propagation运算符,并尝试使用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();
}
}
起初我认为这可能是一个错误,但后来我想到了struct
s。通常,您不能将?.
运算符应用于值类型变量(因为它不能为null)。但您可以将其强制转换为dynamic
,然后应用运算符。所以我将SomeType
更改为struct
并获得相同的异常。
问题是,根据设计,动态变量的空传播总是会抛出异常,因为底层对象可能是值类型?
AccessViolationException
无论如何都很丑陋,你运行代码的时候会得到同样的吗?
答案 0 :(得分:3)
AccessViolationException几乎总是编译器错误或格式错误的PInvoke调用。