【问题标题】:What is wrong with the below Null-Conditional Operator?下面的空条件运算符有什么问题?
【发布时间】:2015-03-10 07:58:54
【问题描述】:

有什么问题

public int Add(int? a, int? b)
{
    return (a?.0 + b?.0);
}

编译错误:无法隐式转换类型“int?”到“布尔”

只是尝试以 C#6.0 的方式添加两个可为空的整数。

我也知道其他方式(如 hasvalue 等),但我正在尝试使用这个新运算符。

【问题讨论】:

  • 空条件运算符是??(尽管对于可空类型只有?)。 ? 已用于三元运算符。
  • 错误信息很有趣...为什么它试图将值转换为bool
  • 这个方法的正确实现应该是return a ?? 0 + b ?? 0
  • @DarrenYoung 感谢您直截了当地命名。我仍然喜欢将其视为有条件的。无论如何,问题的代码片段仍然是错误的;-)

标签: c# nullable c#-6.0


【解决方案1】:

首先,当xint? 时,x?.0 没有任何意义。 0 不是 int? 上的属性或方法。

您似乎在尝试使用空合并运算符?? 而不是空条件操作?.。如果是这种情况,您的方法应该如下所示:

public int Add(int? a, int? b)
{
    return a ?? 0 + b ?? 0;
}

如果不是这种情况,而您的意思是 ?.,那么您可以使用 int 的扩展方法测试此运算符,该方法仅返回其值:

public static int Identity(this int value)
{
    return value;
}

并按照您最初尝试的方式使用它(但使用int?):

public int? Add(int? a, int? b)
{
    return a?.Identity() + b?.Identity();
}

但是,如果您只想将这些 int? 参数组合在一起,则不需要任何新的东西。这很有效:

public int? Add(int? a, int? b)
{
    return (a + b);
}

当两个参数都不是null时,两个选项都会返回结果,否则返回null

【讨论】:

  • 好的...更有趣的问题...为什么会出现错误Cannot implicitly convert type 'int?' to 'bool'?不应该是int doesn't contain a definition for 0`或类似的吗?
  • 第二次 Add 的结果可能不一样...null + null == nullx + null == null 对应每个x,而他的方法是null + 5 == 5
  • @xanatos 为什么你认为它会返回null + 5 == 5
  • 我认为他的意思是a?.0 类似于a ?? 0,所以null + 5 == 0 + 5
  • 因为.0 是一个浮点字面量,所以它将? 视为一个标记,而不是?.
猜你喜欢
  • 2021-04-05
  • 2018-01-03
  • 2010-09-22
  • 1970-01-01
  • 1970-01-01
  • 2010-12-20
  • 1970-01-01
  • 1970-01-01
  • 2012-05-09
相关资源
最近更新 更多