The type of the expression a ?? b depends on which implicit conversions are available between the types
of the operands. In order of preference, the type of a ?? b is A0, A, or B, where A is the type of a, B is the
type of b, and A0 is the type that results from removing the trailing ? modifier, if any, from A. Specifically,
a ?? b is processed as follows:
• If A is not a nullable type or a reference type, a compile-time error occurs. • If A is a nullable type and an implicit conversion exists from b to A0, the result type is A0. At run-time, a
is first evaluated. If a is not null, a is unwrapped to type A0, and this becomes the result. Otherwise, b is
evaluated and converted to type A0, and this becomes the result.
• Otherwise, if an implicit conversion exists from b to A, the result type is A. At run-time, a is first
evaluated. If a is not null, a becomes the result. Otherwise, b is evaluated and converted to type A, and
this becomes the result.
• Otherwise, if an implicit conversion exists from A0 to B, the result type is B. At run-time, a is first
evaluated. If a is not null, a is unwrapped to type A0 (unless A and A0 are the same type) and converted
to type B, and this becomes the result. Otherwise, b is evaluated and becomes the result.
Итак, судя по выделенному:
(i1 ?? i2) -> A == int?, B == int?, A0 == int
Из B (как впрочем и из i2) у нас нет implicit conversion в A0
Судя по следующему, за выделенным пунктом, тип результата должен быть A. Но это не так. Почему?
Аналогичные проблемы и для остальных случаев. Особенно меня беспокоит случай №4, что мешало остаться нуллаблом?
Я что-то упустил или неправильно понимаю?
Здравствуйте, ie, Вы писали:
ie>Аналогичные проблемы и для остальных случаев. Особенно меня беспокоит случай №4, что мешало остаться нуллаблом? ie>Я что-то упустил или неправильно понимаю?
Неправильно понимаешь. GetType — это не оператор получения типа выражения, это метод, возвращающий тип объекта, у которого этот метод был вызван. Если объект == null, то обращение к его методам бросает NullReferenceException.
Здравствуйте, Lloyd, Вы писали:
ie>>Аналогичные проблемы и для остальных случаев. Особенно меня беспокоит случай №4, что мешало остаться нуллаблом? ie>>Я что-то упустил или неправильно понимаю?
L>Неправильно понимаешь. GetType — это не оператор получения типа выражения, это метод, возвращающий тип объекта, у которого этот метод был вызван. Если объект == null, то обращение к его методам бросает NullReferenceException.
Здравствуйте, ie, Вы писали:
ie>Помогите разобраться. Есть такой код:
Все прозрачно как ясный денью Смотри:
1) nullable тип не умеет бокситься. При попытке его забоксить будет забокшено underlying value
2) GetType требует объекта в хипе, а не на стэке. Ибо объект на стэке не имеет GCHandle'а, и, как следствие, не обладает метаинформацией
В подтверждение вышесказанного могу посоветовать провести след. эксперименты:
1)
int i = 0;
i.GetType();
посмотри на IL — там будет боксинг
2) в твоем примере напиши не GetType(), а, например, GetHashCode — все перестанет падать
С уважением, Евгений
JetBrains, Inc. "Develop with pleasure!"
Здравствуйте, xvost, Вы писали:
ie>>Помогите разобраться. Есть такой код: X>Все прозрачно как ясный денью Смотри:
Это понравилось!
X>1) nullable тип не умеет бокситься. При попытке его забоксить будет забокшено underlying value X>2) GetType требует объекта в хипе, а не на стэке. Ибо объект на стэке не имеет GCHandle'а, и, как следствие, не обладает метаинформацией
Да, то что GetType не виртуальный, а следовательно не может быть вызван для value типов без боксинга, не учел.