空传播算子和动态变量
我一直在研究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();
}
}
起初我以为这可能是一个bug,但后来我想到了struct
。 通常你不能申请?.
运算符转换为值类型变量(因为它不能为空)。 但是您可以将其强制转换为dynamic
,然后应用操作员。 所以我将SomeType
改为struct
并得到相同的异常。
问题是,动态变量的空传播总是会引发异常,因为底层对象可能是一个值类型?
无论如何, AccessViolationException
是非常丑陋的,当你运行代码时你会得到相同的吗?
AccessViolationException几乎总是编译器错误或形式不正确的PInvoke调用。
链接地址: http://www.djcxy.com/p/75157.html上一篇: Null propagation operator and dynamic variable
下一篇: Why does .NET foreach loop throw NullRefException when collection is null?