Lo que está viendo es la diferencia entre usar Enumerable.Sum
y realmente agregar los valores usted mismo.
Lo importante aquí es que el null
no es cero. A primera vista, podría pensar que singleSum
debería ser igual a 17, pero eso significaría que tendríamos que asignar semántica diferente a null
según el tipo de datos de la referencia. El hecho de que este sea un int?
no hace diferencia - null
es null
y nunca debe ser semánticamente igual con la constante numérica 0
.
La implementación de Enumerable.Sum
está diseñada para omitir cualquier valor que sea null
en la secuencia, por lo que está viendo el comportamiento diferente entre las dos pruebas. Sin embargo, la segunda prueba devuelve correctamente null
ya que el compilador es lo suficientemente inteligente como para saber que si agrega algo a null
obtendrá null
.
Aquí está la implementación de Enumerable.Sum
que acepta un parámetro de int?
:
public static int? Sum(this IEnumerable<int?> source)
{
if (source == null)
{
throw Error.ArgumentNull("source");
}
int num = 0;
foreach (int? nullable in source)
{
// As you can see here it is explicitly designed to
// skip over any null values
if (nullable.HasValue)
{
num += nullable.GetValueOrDefault();
}
}
return new int?(num);
}
+1 pregunta interesante! –