2013-01-22 13 views
5

Quando provo a fare funzionareLinq Impossibile eseguire il cast Problema

InvTotal = g.Sum(d => d.Field<double>("Total")) < 0 ? "W" : "N", ottengo un errore

Unable to cast object of type 'System.Double' to type 'System.String'.

Come è necessario modificare il codice per farlo compilare correttamente.

+1

il tipo di 'InvTotal' è? – kmatyaszek

risposta

10

Penso che sia necessaria una parentesi corretta.

var InvTotal = (g.Sum(d => d.Field<double>("Total")) < 0) ? "W" : "N" 

Senza di loro il compilatore compilare 0 ? "W" : "N" prima, e il risultato di tale verrà utilizzato nel confronto.

A volte, il compilatore C# ha bisogno di un piccolo aiuto se si tratta di? operatore.

+1

La parentesi non è un problema. Guarda la precedenza degli operatori [Operatori C#] (http://msdn.microsoft.com/en-us/library/6a71f45d.aspx) – Rafal

1

qual è il tipo di InvTotal? Suppongo che al momento sia un doppio. Dovrebbe funzionare se si modifica il tipo in String, o si rimuove la dichiarazione di InvTotal e si cambia la linea in "var InvTotal = g.Sum ..."

0

Penso che in questo caso non ci siano problemi con le parentesi.

Il problema è con il tipo di InvTotal, se si scrive var InvTotal =.... tutto andrà bene.

Spiegazione di Maarten risposta:

In C# non possiamo scrivere qualcosa di simile:

Error: "Cannot implicitly convert type 'int' to 'bool'"

C# non è:

int x = 2; 
var tmp = x ? "W" : "N"; 

Se proviamo, avremo l'errore seguente C++ dove zero indica valori falsi e non zero indica true.

modo da poter scrivere qualcosa di simile:

g.Sum(d => d.Field<double>("Total")) < 0 ? "W" : "N" 

si può anche avere operatori logici multipli senza parentesi nella prima sezione del operatore ternario:

g.Sum(d => d.Field<double>("Total")) < 0 && 1 == 1 && 2 != 4 && 9 != 0 ? "W" : "N"; 
+0

Se non conosci il tipo di InvTotal, allora come spieghi l'eccezione che dice che un doppio non può essere convertito in una stringa? Dal momento che se il? l'operatore lavora dovrebbe risultare in una stringa, poiché questo è il tipo risultante di? operatore. – Maarten

+0

È difficile spiegare perché @ user1936588 non ci ha detto del tipo di 'InvTotal', ma come ti ho mostrato, non è necessario utilizzare le parentesi. Quindi penso che @ user1936588 possa provare la soluzione con parentesi senza parola chiave var, e vedremo se sono necessarie le parentesi. A proposito, è una domanda interessante :) – kmatyaszek

Problemi correlati