Ce que vous voyez est la différence entre l'utilisation de Enumerable.Sum
et l'ajout de valeurs vous-même.
La chose importante ici est le null
n'est pas zéro. À première vue, vous penseriez que singleSum
devrait égale 17 mais cela signifierait que nous devrions assigner des sémantiques différentes à null
en fonction du type de données de la référence. Le fait qu'il s'agisse d'un int?
ne fait aucune différence - null
est null
et ne devrait jamais être sémantiquement égal à la constante numérique 0
.
L'implémentation de Enumerable.Sum
est conçue pour ignorer toute valeur null
dans la séquence. C'est la raison pour laquelle vous constatez le comportement différent entre les deux tests. Cependant, le deuxième test renvoie correctement null
car le compilateur est suffisamment intelligent pour savoir que l'ajout de null
donne null
.
Voici la mise en œuvre de Enumerable.Sum
qui accepte un paramètre 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 Question intéressante! –