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 .
obrzydliwie wszechstronny ... –
szokująco precyzyjny i dokładny. –
@David: To nie było wyczerpujące, zanim miałem cytat ze specyfikacji językowej. Czuję się z tym teraz lepiej :) –