Как использовать Условную Операцию с Интервалом Nullable

Небольшая проблема. Какие-либо парни идеи, почему это не работает?

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

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

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

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

8
задан Stefan Steinegger 22 April 2016 в 14:17
поделиться

5 ответов

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

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

21
ответ дан 5 December 2019 в 05:44
поделиться

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

int? nullableIntVal = (this.Policy == null) ? (int?) null : 1; 
4
ответ дан 5 December 2019 в 05:44
поделиться

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

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

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

1
ответ дан 5 December 2019 в 05:44
поделиться

Возможно, вы могли бы попробовать:

default( int? );

вместо null

2
ответ дан 5 December 2019 в 05:44
поделиться

int? i = (true? новый int? (): 1);

1
ответ дан 5 December 2019 в 05:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: