2010-05-21 13 views
8

Mały problem. Masz pomysł, dlaczego to nie działa?Jak korzystać z warunkowej operacji z Nullable Int

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

próbuję powrócić null jeśli wyrażenie lewa jest prawda, jeszcze 1. Wydaje się proste, ale daje błąd kompilacji.

Nie można ustalić typu warunkowego wyrażenia, ponieważ nie istnieje żadna niejawna konwersja między null i int.

Gdybym wymienić null w ? null : 1 z jakiejkolwiek uzasadnionej int, wtedy nie ma problemu.

Odpowiedz

20

Tak - kompilator nie może znaleźć odpowiedni typ dla wyrażenia warunkowego. Zignoruj ​​fakt, że przypisujesz to do int? - kompilator nie używa tych informacji. Więc wyrażenie jest:

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

Jaki jest typ tego wyrażenia? Specyfikacja języka stwierdza, że ​​musi to być typ drugiego argumentu lub argumentu trzeciego operandu. null nie ma typu, więc musiałby to być int (typ trzeciego operandu) - ale nie ma konwersji z null na int, więc nie powiedzie się.

Obsada jeden z argumentów do int? i będzie działać, lub użyć innego sposobu expessing wartość null - tak żadnego z nich:

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

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

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

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

zgadzam się, że to nieznaczny ból, że trzeba to zrobić .


od C# 3.0 języka sekcji specyfikacji 7.13:

drugi i trzeci argumenty z : operatora kontrolowanie typu ekspresji warunkowej . Niech X i Y będą typami drugiego i trzeciego argumentu .Następnie

  • Jeśli X i Y są tego samego typu, to jest rodzaj warunkowego ekspresji.

  • przeciwnym razie, jeśli istnieje ukryte konwersji (§6.1) od X do Y, lecz nie od Y, X, a Y oznacza typ ekspresji warunkowej .

  • W przeciwnym razie, jeśli ukryte konwersji (§6.1), istnieje od Y, X, ale nie od X do Y, wówczas X jest typu ekspresji warunkowej .

  • W przeciwnym razie nie można określić typu wyrażenia i wystąpi błąd podczas kompilacji .

+1

obrzydliwie wszechstronny ... –

+0

szokująco precyzyjny i dokładny. –

+0

@David: To nie było wyczerpujące, zanim miałem cytat ze specyfikacji językowej. Czuję się z tym teraz lepiej :) –

1

Działa to: int? nullableIntVal = (this.Policy == null) ? null : (int?)1;.

Powód (skopiowane z komentarzem):

wiadomość

Błąd znajduje ponieważ obie gałęzie operatora (null i 1) ?: nie masz typ zgodny. Rozgałęzienia nowego rozwiązania (przy użyciu null i (int?)1).

+0

int będzie domyślnie oddanych do int? - OP ma problemy z przypisaniem wartości null do int? –

+0

Komunikat o błędzie jest spowodowany tym, że dwie gałęzie operatora?: (Null' i '1') nie mają zgodnego typu. Rozgałęzienia nowego rozwiązania (używając 'null' i' (int?) 1 '). –

+0

Nie sądzę, że chce, żeby to było po prostu 1 – KroaX

4

spróbuj tego:

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

Może spróbuj:

default(int?); 

zamiast null