Sì - il compilatore non riesce a trovare un tipo appropriato per l'espressione condizionale. Ignora il fatto che lo stai assegnando a un int?
- il compilatore non usa queste informazioni. Quindi l'espressione è:
(this.Policy == null) ? null : 1;
Qual è il tipo di questa espressione? Le specifiche del linguaggio indicano che deve essere il tipo del secondo operando o quello del terzo operando. null
non ha alcun tipo, quindi dovrebbe essere int
(il tipo del terzo operando) - ma non c'è conversione da null
a int
, quindi non riesce.
Fusioni uno dei due operandi per int?
e funzionerà, o utilizzare un altro modo di expessing il valore nullo - in modo che qualsiasi di questi:
(this.Policy == null) ? (int?) null : 1;
(this.Policy == null) ? null : (int?) 1;
(this.Policy == null) ? default(int?) : 1;
(this.Policy == null) ? new int?() : 1;
Sono d'accordo che è un leggero dolore che si deve fare questo .
Dalla C# 3.0 lingua specifica sezione 7.13:
Il secondo e terzo operandi del :? Operatore di controllo del tipo di espressione condizionale. Sia X e Y sia i tipi del secondo e terzo operando .Poi,
Se X e Y sono dello stesso tipo, allora questo è il tipo di condizionale espressione.
Altrimenti, se una conversione implicita (§6.1) esiste da X a Y, ma non da Y a X, allora Y è il tipo di espressione condizionale.
Altrimenti, se una conversione implicita (§6.1) esiste da Y a X, ma non da X a Y, allora X è il tipo di espressione condizionale.
In caso contrario, non è possibile determinare alcun tipo di espressione e si verifica un errore in fase di compilazione .
fonte
2010-05-21 10:50:04
disgustosamente comprensivo ... –
incredibilmente preciso e accurato. –
@David: non era completo prima che avessi la citazione dalle specifiche del linguaggio. Mi sento meglio ora :) –