Да - компилятор не может найти подходящий тип условного выражения. Игнорируйте тот факт, что вы назначаете его int?
- компилятор не использует эту информацию. Таким образом, выражение:
(this.Policy == null) ? null : 1;
Какой тип этого выражения? Спецификация языка утверждает, что он должен быть либо типом второго операнда, либо типом третьего операнда. null
не имеет типа, поэтому он должен быть int
(тип третьего операнда) - но нет никакого преобразования от null
до int
, поэтому он терпит неудачу.
Cast либо из операндов int?
и он будет работать, или использовать другой способ expessing нулевого значения - так что любой из них:
(this.Policy == null) ? (int?) null : 1;
(this.Policy == null) ? null : (int?) 1;
(this.Policy == null) ? default(int?) : 1;
(this.Policy == null) ? new int?() : 1;
Я согласен, что это небольшая боль, что вы должны сделать это ,
от языка спецификации секции 7.13 C# 3.0:
Второй и третий операнды : оператор управления типом условного выражения . Пусть X и Y - типы второго и третьего операндов .Затем
Если X и Y имеют одинаковый тип, то это тип условного выражения .
В противном случае, если неявное преобразование (§6.1) существует с X на Y, но не от Y к X, то Y является тип условного выражения .
В противном случае, если неявное преобразование (§6.1) существует с Y к X, но не от Х до Y, то Х является тип условного выражения .
В противном случае тип выражения не может быть определен, и возникает ошибка времени компиляции .
тошнотворно всеобъемлющий ... –
безумно точный и точный. –
@David: Это не было всеобъемлющим, прежде чем я получил цитату из спецификации языка. Я чувствую себя лучше об этом сейчас :) –