C# 添加可为null的int时是否保留null?

C# 添加可为null的int时是否保留null?,c#,nullable,C#,Nullable,我想添加可为null的int?并在所有值都为null时保留null 我希望得到以下结果: 1 + 2 = 3 1 + null = 1 null + null = null O + null = 0 问题是,如果我将一个值与null相加,结果就是null int? i1 = 1; int? i2 = null; int? total = i1 + i2; // null 我看到了这条线索: 林克: var nums = new int?[] {null, null, null}; var

我想添加可为null的
int?
并在所有值都为
null
时保留
null

我希望得到以下结果:

1 + 2 = 3
1 + null = 1
null + null = null
O + null = 0
问题是,如果我将一个值与null相加,结果就是null

int? i1 = 1;
int? i2 = null;
int? total = i1 + i2; // null
我看到了这条线索:

林克:

var nums = new int?[] {null, null, null};
var total = nums.Sum(); // 0
我得到0,我想要空值

我找到的唯一方法是创建一个函数:

static int? Sum(params int?[] values)
{
  if (values.All(item => !item.HasValue))
    return null;
  else
    return values.Sum();
}

有没有一种方法可以在本地实现这一点?

一个选项可能是使用
聚合
的扩展方法。比如:

public static int? NullableSum(this IEnumerable<int?> values)
{
    return values.Aggregate((int?)null, (sum, value)   
        => value.HasValue ? (sum ?? 0) + value : sum + 0);
}
公共静态int?NullableSum(此IEnumerable值)
{
返回值。聚合((int?)null,(总和,值)
=>value.HasValue?(总和0)+值:总和+0);
}
从功能角度看,它与您的自定义
Sum
方法做的事情基本相同,无需在数组中迭代两次

本质上,它将初始值设置为
null
,但一旦看到任何
null
值,它就开始将
null
值视为0


因此,如果所有的输入都是
null
,它将返回
null
——否则它的行为基本上与LINQ的
Sum
相同一个选项可能是使用
Aggregate
的扩展方法。比如:

public static int? NullableSum(this IEnumerable<int?> values)
{
    return values.Aggregate((int?)null, (sum, value)   
        => value.HasValue ? (sum ?? 0) + value : sum + 0);
}
公共静态int?NullableSum(此IEnumerable值)
{
返回值。聚合((int?)null,(总和,值)
=>value.HasValue?(总和0)+值:总和+0);
}
从功能角度看,它与您的自定义
Sum
方法做的事情基本相同,无需在数组中迭代两次

本质上,它将初始值设置为
null
,但一旦看到任何
null
值,它就开始将
null
值视为0


因此,如果所有的输入都是
null
它将返回
null
——否则它的行为基本上与LINQ的
Sum
相同。好吧,编写一个方法不是一个坏方法:)为它创建自己的类型、运算符和LINQ函数。我不知道链接副本中的哪个答案解决了这个问题。这是OP链接到的线程,所以他们已经清楚地阅读了它。有人能帮我摆脱痛苦吗?OP明确地说他们希望
null+null
成为
null
,而不是被当作
0
,这就是我感到困惑的原因。谁在乎老年退休金计划的理由是什么,这是他们要求的。我同意老年退休金计划想要的东西闻起来很难闻,但我看不出行为上的矛盾。他们说,如果所有值都是
null
,他们希望总和是
null
,在任何其他情况下,将
null
视为
0
。对我来说似乎很简单。我不明白副本是如何回答场景OP的,它是
null+null=null
而不是
0
。我是否异常密集?好吧,编写方法不是一个坏方法:)为它创建自己的类型、运算符和linq函数。我不知道链接副本中的哪个答案解决了这个问题。这是OP链接到的线程,所以他们已经清楚地阅读了它。有人能帮我摆脱痛苦吗?OP明确地说他们希望
null+null
成为
null
,而不是被当作
0
,这就是我感到困惑的原因。谁在乎老年退休金计划的理由是什么,这是他们要求的。我同意老年退休金计划想要的东西闻起来很难闻,但我看不出行为上的矛盾。他们说,如果所有值都是
null
,他们希望总和是
null
,在任何其他情况下,将
null
视为
0
。对我来说似乎很简单。我不明白副本是如何回答场景OP的,它是
null+null=null
而不是
0
。我是不是异常密集?好吧,我会用你的函数替换我的函数,你的函数效率更高。我会用你的函数替换我的函数,你的函数效率更高