加入收藏 | 设为首页 | 会员中心 | 我要投稿 安卓应用网 (https://www.0791zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 程序设计 > 正文

.net – LINQ可空类型的聚合行为

发布时间:2020-05-23 12:08:32 所属栏目:程序设计 来源:互联网
导读:有人能解释一下这里发生了什么吗?这两件事都是真的吗? [TestMethod]public void WhatIsGoingOnHere(){ Listint? list = new Listint? { 1, 2, 3, null, 5, 6 }; Assert.AreEqual(17, list.Sum()); int? singleSum = 1 + 2

有人能解释一下这里发生了什么吗?这两件事都是真的吗?

[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);
}

(编辑:安卓应用网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读