Я смотрел на оператор нулевого распространения в С# 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 в любом случае довольно уродлив, вы получаете то же самое при запуске кода?