2010-05-21 2 views
8

Небольшая проблема. Любая идея ребята, почему это не работает?Как использовать условную операцию с Nullable Int

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

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

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

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

ответ

20

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

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

+1

тошнотворно всеобъемлющий ... –

+0

безумно точный и точный. –

+0

@David: Это не было всеобъемлющим, прежде чем я получил цитату из спецификации языка. Я чувствую себя лучше об этом сейчас :) –

1

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

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

сообщение

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

+0

int будет в явном виде лить в int? - У ОП возникают проблемы с присвоением значения null int? –

+0

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

+0

Я не думаю, что он хочет, чтобы это было просто 1 – KroaX

4

попробовать это:

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

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

default(int?); 

вместо нулевой

Смежные вопросы