Оператор Null и динамическая переменная

Я смотрел на оператор нулевого распространения в С# 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();
    }
}

Сначала я подумал, что это может быть ошибкой, но потом я подумал о struct s. Обычно вы не можете применить оператор ?. к переменной типа значения (потому что она не может быть нулевой). Но вы можете применить его к dynamic, а затем применить оператор. Поэтому я изменил SomeType на struct и получил то же исключение.

Вопрос заключается в том, что дизайн для динамических переменных всегда будет генерировать исключение, потому что базовый объект может быть типом значений?

AccessViolationException в любом случае довольно уродлив, вы получаете то же самое при запуске кода?

Ответы

Ответ 1

AccessViolationException почти всегда является либо ошибкой компилятора, либо неправильным вызовом PInvoke.