Тип условного выражения не может быть определен, поскольку неявное преобразование между 'int' и
почему это не компиляция?
int? number = true ? 5 : null;
тип условного выражения не может быть определен, потому что нет неявного преобразования между 'int' и
2 ответов
спек (§7.14) говорит, что для условного выражения b ? x : y
, есть три возможности, либо x
и y
оба имеют тип и некоторых хорошие условия встречаются, только один из x
и y
тип и некоторых хорошие условия выполняются, или возникает ошибка времени компиляции. Здесь "определенные хорошие условия" означает, что возможны определенные преобразования, которые мы рассмотрим подробнее под.
теперь давайте обратимся к германской части спецификации:
если только один из
x
иy
имеет тип, и какx
иy
неявно конвертируются в этот тип, тогда это тип условного выражения.
проблема здесь в том, что в
int? number = true ? 5 : null;
только один из условных результат имеет тип. Вот!--4--> это int
буквальный, и y
is null
что делает не тип и null
неявно конвертируется в int
1. Поэтому "определенные хорошие условия" не выполняются, и возникает ошибка времени компиляции.
здесь are два способа обойти это:
int? number = true ? (int?)5 : null;
вот мы все еще в том случае, когда только один из x
и y
имеет тип. Обратите внимание, что null
еще не имеет типа, но компилятор не будет иметь никаких проблем с этим, потому что (int?)5
и null
оба неявно преобразуемым к int?
(§6.1.4 и §6.1.5).
другой путь, очевидно:
int? number = true ? 5 : (int?)null;
но теперь мы должны читать разные пункт в спецификации, чтобы понять, почему это так:
если
x
типаX
иy
типаY
затем
если существует неявное преобразование (§6.1) от
X
дляY
, но неY
toX
, потомY
тип условного выражения.если существует неявное преобразование (§6.1) от
Y
toX
, но неX
toY
, потомX
тип условного выражения.в противном случае тип выражения не может быть определен, и возникает ошибка времени компиляции.
здесь x
в тип int
и y
типа int?
. Нет неявного преобразования из int?
to int
, но есть неявное преобразование из int
to int?
так типа выражение int?
.
1: обратите внимание далее, что тип левой стороны игнорируется при определении типа условного выражения, что является общим источником путаницы здесь.
null
не имеет никакого идентифицируемого типа - ему просто нужно немного подтолкнуть, чтобы сделать его счастливым:
int? number = true ? 5 : (int?)null;