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