C# Elvis 运算符可为空的布尔值

Dho*_*LEM -2 .net c# boolean operators

我如何向 Elvis Operator 申请以下内容:

Exp: b= a?.attr> 0
Run Code Online (Sandbox Code Playgroud)

结果应该是:如果anullb应该是null,否则,b应该是结果attr > 0

Eri*_*ert 5

正如其他人在现已删除的答案中指出的那样,您遇到的问题是由于设计决策存在问题。“提升”运算符是普通运算符的一个版本,它接受可空值,如果操作数为空则生成空值,否则生成常规运算符的可空版本。例如,加法是一个提升操作符:

int? a = 111;
int? b = null;
int? c = a + a; // 222, but nullable
int? d = a + b; // null
Run Code Online (Sandbox Code Playgroud)

您遇到的问题是C#中的比较运算符不遵循其他提升运算符的模式。在 C# 中,比较运算符是:

  • == 如果两个操作数都为空,则为真,如果正好有一个操作数为空,则为假,否则为非提升等式

  • != 做相反的事情 ==

  • <><=>=产生假如果一个操作数为空,否则定期做比较。请注意,这意味着x == y可以为真,x >= y也可以为假,这意味着>=与“大于或等于”的含义不同。

这是一团糟,您对此感到困惑是正确的。

您可能要做的只是编写一个具有您想要的语义的方法:

static bool? LiftedLessThan(int? x, int? y) => 
  (x == null | y == null) ? (bool?)null : x.Value < y.Value;
Run Code Online (Sandbox Code Playgroud)

(请注意,为了使 C# 类型系统满意,需要强制转换,这要求条件的结果和替代项都具有一致的类型。)

现在你的程序片段是:

bool? b = LiftedLessThan(a?.attr, 0);
Run Code Online (Sandbox Code Playgroud)

看起来不太好,但它有效。