有人能解释一下这里发生了什么吗?这两件事都是真的吗?
[TestMethod] public void WhatIsGoingOnHere() { List<int?> list = new List<int?> { 1,2,3,null,5,6 }; Assert.AreEqual(17,list.Sum()); int? singleSum = 1 + 2 + 3 + null + 5 + 6; Assert.IsNull(singleSum); }
具体来说,为什么Sum()方法不返回’null’?或者单身不等于17?
你看到的是使用Enumerable.Sum和实际自己添加值之间的区别.
这里重要的是null不为零.乍一看,您会认为singleSum应该等于17,但这意味着我们必须根据引用的数据类型将不同的语义分配给null.这是一个int的事实?没有区别 – null为null,并且永远不应该在语义上与数字常量0相等.
Enumerable.Sum的实现旨在跳过序列中为null的任何值,这就是为什么您看到两个测试之间的不同行为.然而,第二个测试正确地返回null,因为编译器足够聪明,知道向null添加任何内容会产生null.
以下是接受int参数的Enumerable.Sum的实现:
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); }