2009-05-06 26 views
10
double? test = true ? null : 1.0; 

Nel mio libro, questo è lo stesso diPerché questo codice C# non viene compilato?

if (true) { 
    test = null; 
} else { 
    test = 1.0; 
} 

Ma la prima linea dà questo errore del compilatore:

Type of conditional expression cannot be determined because there is no implicit conversion between ' <null> ' and ' double '.

+0

puoi sempre inviare l'Errata all'editore del libro :) o forse è già stato trovato ed è nel libro Errata (normalmente nel sito web del publisher) – balexandre

+3

L'espressione "nel mio libro" significa "per quanto ne so" - Non si tratta di un riferimento a un libro vero :-) –

+1

La tua posizione è identica a quella dell'altro non è confermata dalla specifica della lingua o dall'implementazione; quelle due cose sono davvero molto diverse! Il messaggio di errore è corretto; la specifica del linguaggio richiede che l'espressione sia implicitamente convertibile in double ?, che richiede a sua volta che l'espressione abbia un tipo noto. L'espressione non ha un tipo noto, quindi l'errore. –

risposta

24

Ciò accade perché il compilatore tenta di valutare l'istruzione da destra a sinistra. Ciò significa che vede 1.0 e decide che è doppio (non doppio?) E quindi vede null.

Quindi non v'è chiaramente alcuna conversione implicita tra double e null (in realtà non v'è alcuna conversione implicita tra Struct e null).

Ciò che si può fare è dire esplicitamente al compilatore che una delle due espressioni convertibili l'una con l'altra.

double? test = true ? null : (double?) 1.0; // 1 
double? test = true ? (double?)null : 1.0;  // 2 
double? test = true ? default(double?) : 1.0; // 3 
double? test = true ? new double?() : 1.0;  // 4 
+0

Grazie, funziona! –

7
double? test = true ? (double?)null : 1.0; 

funzionerà. Questo perché non vi è alcuna conversione dal tipo della prima espressione (null) al tipo della seconda espressione (double).

+0

Hehe, stessa risposta solo altre ovvio, ora confuso :) – leppie

+0

Sorpresa, entrambi i metodi funzionano :) – leppie

+0

"Impossibile convertire null in" double "perché è un tipo di valore non annullabile" –

2

Poiché il compilatore non può capire che per nulla e 1.0 per essere compatibile, i valori devono essere espressi raddoppiare ?. Questo deve essere dichiarato esplicitamente.

double? test = true ? (double?) null : 1.0; 
+0

'null' (il letterale) ** è ** convertibile in' double? '. Altrimenti la risposta accettata con 'vero? null: (double?) 1.0' non può funzionare. Ciò che "null" non è convertibile è "double". –

+0

@JeppeStigNielsen Implicitamente. Sono completamente d'accordo che è convertibile. –

4

Il lato sinistro dell'assegnazione non viene utilizzato quando si deduce il tipo di espressione?:.

In b ? A : B, i tipi di A e B devono essere uguali oppure uno deve essere implicitamente convertibile nell'altro.

+2

C'è un po 'di sottigliezza qui - è che il tipo di A deve essere convertibile al tipo di B, o che A deve essere convertibile al tipo di B? Il compilatore in realtà si sbaglia! Vedi questo post http://blogs.msdn.com/ericlippert/archive/2006/05/24/type-inference-woes-part-one.aspx per dettagli. –

Problemi correlati