2010-08-13 21 views
6

Por lo que puedo entender, el método linq FirstOrDefault() devuelve null si un conjunto de registros está vacío. ¿Por qué no se puede usar el operador ?? en contra de la función? De este modo:FirstOrDefault() no se puede emparejar ?? operador

Double d = new Double[]{}.FirstOrDefault() ?? 0.0; 


actualización

no quiero para comprobar si es dnull más adelante en mi código. Y haciendo:

Double d new Double[]{}.FirstOrDefault() == null 
     ? 0.0 
     : new Double[]{}.FirstOrDefault(); 

... o:

var r = new Double[]{}.FirstOrDefault(); 

Double d = r == null ? 0.0 : r; 

... parece un poco exagerado - Me gustaría hacer esto nulo cheque en una línea de código.

+0

Mientras está probando, puede reemplazar 'new Double [] {}. FirstOrDefault();' con 'default (double)'. – Kobi

Respuesta

10

En realidad, FirstOrDefault<T>() devuelve t, que es un valor o default(T).

default(T) es o bien null o (T)0 para los tipos de valor (como double)

11

Porque el operador nulo-coalescente (??) se aplica solo a tipos de referencia anulables, mientras que Double es un tipo de valor. En su lugar, podría usar un doble nulo (double?).

+6

E incluso si funcionó, "?? 0.0" es redundante en este caso. – FuleSnabel

+1

@FuleSnabel, absolutamente, ya que '0.0' es el valor predeterminado de un doble de todos modos. –

1

Haciéndolo nullable debería funcionar. Pero, a continuación, por lo que es su nullable, todo depende de su escenario ...

Double d = new Double?[] { }.FirstOrDefault() ?? 0.0; 
5

El método se llama FirstOrDefault no FirstOrNull, es decir, que volverá 0, el valor predeterminado de un doble de todos modos por lo que no es una necesidad de el ??.

+0

Hubiera aceptado su respuesta. Pero James Curran proporcionó una más elaborada. Gracias Ben. – roosteronacid

0

Aunque otros han respondido por qué tiene problemas de compilación aquí, tiene razón en que esto es problemático para los tipos de valores. Que yo sepa, no hay forma de saber en este caso si el resultado de cero fue porque el primer elemento realmente era cero, o porque el IEnumerable<double> estaba vacío.

En el ejemplo que ha dado, el valor de retorno es cero todos modos, por lo que todo lo que necesita es:

var r = new double[]{...}.FirstOrDefault(); 

Suponiendo que tenía un valor de retorno distinto de cero, usted tiene algunas opciones:

var r = !myDoubles.Any() ? fallback : myDoubles.First(); 

o

var r = myDoubles.Cast<double?>().FirstOrDefault() ?? fallback; 

Si tiene Zen Linq Extensions, que puede hacer:

var r = myDoubles.FirstOrFallback(fallback); 
Cuestiones relacionadas