Как использовать условную операцию с Nullable Int - PullRequest
8 голосов
/ 21 мая 2010

небольшая проблема. Есть идеи, ребята, почему это не работает?

int? nullableIntVal = (this.Policy == null) ? null : 1;

Я пытаюсь вернуть null, если левое выражение равно True, иначе 1. Кажется простым, но дает ошибку компиляции.

Тип условного выражения не может быть определен, поскольку не существует неявного преобразования между null и int.

Если я заменим null в ? null : 1 на любой действительный int, то проблем не будет.

Ответы [ 5 ]

21 голосов
/ 21 мая 2010

Да - компилятор не может найти подходящий тип для условного выражения. Не обращайте внимания на тот факт, что вы присваиваете его 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 является типом условное выражение.

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

4 голосов
/ 21 мая 2010

попробуйте это:

int? nullableIntVal = (this.Policy == null) ? (int?) null : 1; 
2 голосов
/ 21 мая 2010

Может быть, вы могли бы попробовать:

default( int? );

вместо нуля

1 голос
/ 21 мая 2010

INT?i = (true? new int? (): 1);

1 голос
/ 21 мая 2010

Это работает: int? nullableIntVal = (this.Policy == null) ? null : (int?)1;.

Причина (скопировано из комментария):

Сообщение об ошибке вызвано тем, что две ветви оператора ?: (null и 1) не имеют совместимого типа. Ветви нового решения (используя null и (int?)1) делают.

...