空传播算子和动态变量

我一直在研究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?