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



我怎样才能向猫王操作员申请以下内容:

Exp: b= a?.attr> 0

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

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

int? a = 111;
int? b = null;
int? c = a + a; // 222, but nullable
int? d = a + b; // null

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

  • 如果两个操作数都为空,则==产生 true;如果正好一个操作数为空,则生成 false;否则,非提升相等式

  • !===相反

  • <><=>=如果任何一个操作数为空,则产生假,否则进行常规比较。请注意,这意味着x == y可以为真,x >= y可以为假,这意味着>=与"大于或等于"的含义不同。

这是一团糟,你被它弄糊涂是对的。

你可以做的是编写一个具有你想要的语义的方法:

static bool? LiftedLessThan(int? x, int? y) => 
(x == null | y == null) ? (bool?)null : x.Value < y.Value;

(请注意,强制转换是保持 C# 类型系统满意所必需的,这要求条件的结果和替代项都具有一致的类型。

现在您的程序片段是:

bool? b = LiftedLessThan(a?.attr, 0);

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

根据我的理解,您希望在带有三元运算符的单行中执行以下操作:

if(A==null){
B=null;
}
else{
B= A.Attr > 0
}

默认情况下,您可以简单地将 B 分配给 null:

bool? B = null;
if(A==null){
B= A.Attr > 0
}

或者正如德米特里·比琴科评论的那样:

B = a == null ? (bool?)null : a.Attr > 0;

您可以确认您的预期结果是:

A 不为空,A.Attr = 0 => B= 假 A 不为空,A.Attr = 2 => B= 真 A 不为空,A.Attr = -1 => B=



A 为空,A.Attr = 为空 => B= 为空

public class A { public int Attr; }
private static void SO_52969048()
{
bool? B ;
var inputs = new List<A> {
new A{ Attr = 0},
new A{ Attr = 2},
new A{ Attr = -1},
null
};
foreach (var a in inputs)
{
B = a == null ? (bool?)null : a.Attr > 0;
Console.WriteLine($" A  {(a == null ? "is null" : "is not null")}, A.Attr = {(a == null ? "is null" : a.Attr.ToString())} => B= {(B == null ? "is null" : B.ToString())}");
}
}

最新更新