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