C# 为什么林克森<;可为空<;T>&燃气轮机;返回<;可为空<;T>>?LINQ.Sum什么时候返回null?

C# 为什么林克森<;可为空<;T>&燃气轮机;返回<;可为空<;T>>?LINQ.Sum什么时候返回null?,c#,linq,sum,nullable,C#,Linq,Sum,Nullable,遇到一个场景,在这个场景中,我们必须对一个可为null的十进制列表进行求和,然后我们必须针对null进行验证,因为CA警告等等。代码的作者说,总和永远不会是0,这就是为什么他/她没有进行检查的原因 想一想,我还没有找到为什么list.Sum返回一个decimal?type而不是'decimal'的原因 对签名背后的原因和/或如何处理这种情况有何想法?(我可以将null合并设置为只返回十进制,但感觉像是一个黑客) 为了得到一点代码,我试图得到null: var case1 = (new List&

遇到一个场景,在这个场景中,我们必须对一个可为null的十进制列表进行求和,然后我们必须针对null进行验证,因为CA警告等等。代码的作者说,总和永远不会是0,这就是为什么他/她没有进行检查的原因

想一想,我还没有找到为什么list.Sum返回一个
decimal?
type而不是'decimal'的原因

对签名背后的原因和/或如何处理这种情况有何想法?(我可以将null合并设置为只返回十进制,但感觉像是一个黑客)

为了得到一点代码,我试图得到null:

var case1 = (new List<decimal?> { }).Sum();
var case2 = (new List<decimal?> { null, null }).Sum();
var case1=(新列表{}).Sum();
var case2=(新列表{null,null}).Sum();

Sum(…)
返回
X
。时期它就是这样声明的,它就是这样做的。我同意它可以只返回
十进制
,但有人认为它不应该返回
X
这里不是
T
,因为没有这样的方法,但是每个数字类型都有特定的方法,可为空的版本返回可为空的。请注意,对于
Queryable.Sum
,它是不同的。。。想象一下这个查询:
selectsum(X)FROM(select1x,其中1=0)Base
,这样一个
selectsum()。结果是
NULL
@jeroenmoster:xanatos
的意思是
IQueryable.Sum()
可以返回
NULL
@Groo:
Math.Floor(2147483649.56)
不适合
int
,因此不是最好的例子。但通常您希望输入类型与输出类型匹配,是的。是的,但很明显,
Enumerable.Sum
Queryable.Sum
应该具有相同的签名,一旦您决定了一个签名。LINQtoObjects应该只是更通用模式的一个实现。我不能马上想出一个用例,它会给
Enumerable.Sum
的返回类型带来麻烦,但我很确定这只是我缺乏想象力。对于
可枚举.Sum
始终返回
0
是否是一个好主意,正如其他人所争论的那样,是有争议的,但一般规范也不禁止这样做。