Тип условного выражения не может быть определен, поскольку неявное преобразование между '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 неявно конвертируется в int1. Поэтому "определенные хорошие условия" не выполняются, и возникает ошибка времени компиляции.

здесь 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 to X, потом Y тип условного выражения.

  • если существует неявное преобразование (§6.1) от Y to X, но не X to Y, потом X тип условного выражения.

  • в противном случае тип выражения не может быть определен, и возникает ошибка времени компиляции.

здесь x в тип int и y типа int?. Нет неявного преобразования из int? to int, но есть неявное преобразование из int to int? так типа выражение int?.

1: обратите внимание далее, что тип левой стороны игнорируется при определении типа условного выражения, что является общим источником путаницы здесь.


null не имеет никакого идентифицируемого типа - ему просто нужно немного подтолкнуть, чтобы сделать его счастливым:

int? number = true ? 5 : (int?)null;