Да - компилятор не может найти подходящий тип для условного выражения. Не обращайте внимания на тот факт, что вы присваиваете его int?
- компилятор не использует эту информацию. Итак, выражение:
(this.Policy == null) ? null : 1;
Какой тип этого выражения? Спецификация языка утверждает, что это должен быть либо тип второго операнда, либо тип третьего операнда. У null
нет типа, поэтому он должен быть int
(тип третьего операнда) - но преобразования из null
в int
нет, поэтому он завершается неудачей.
Приведите любой из операндов к int?
, и он будет работать, или используйте другой способ определения нулевого значения - так что любой из них:
(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, но не
от X до Y, то X является типом
условное выражение.
В противном случае тип выражения не может быть определен, и ошибка времени компиляции
происходит.