C# 将Elvis运算符与string.Equals结合使用

C# 将Elvis运算符与string.Equals结合使用,c#,.net,c#-6.0,C#,.net,C# 6.0,我想知道为什么以下代码在C 6.0中工作: 在本例中,数据是一个随机类,包含作为公共字符串的val if ("x".Equals(data.val?.ToLower()) { } 但下面这句话不是: if (data.val?.ToLower().Equals("x")) { } Visual Studio向我显示以下错误: 无法将类型“bool”隐式转换为“bool”。存在显式转换。是否缺少强制转换 第一条语句计算Equals的返回值,而第二条语句计算bool?这可能是空的。我没有要测试的

我想知道为什么以下代码在C 6.0中工作: 在本例中,数据是一个随机类,包含作为公共字符串的val

if ("x".Equals(data.val?.ToLower()) { }
但下面这句话不是:

if (data.val?.ToLower().Equals("x")) { }
Visual Studio向我显示以下错误:

无法将类型“bool”隐式转换为“bool”。存在显式转换。是否缺少强制转换


第一条语句计算Equals的返回值,而第二条语句计算bool?这可能是空的。

我没有要测试的c 6.0,但这应该可以工作

if (data.val?.ToLower().Equals("x") ?? false) { }
将最终返回一个布尔值,因为调用失败,但是:

if (data.val?.ToLower().Equals("x")) { }

当对表达式求值时,它将返回一个不同于bool的结构,前者是一个可以赋值为null的结构,后者只能是if期望的true或false。此外,在C中,根据C规范,空值的计算结果不会为false。

进一步了解其他答案,我认为如果您将等效代码长时间地写出来,这样您就可以看到发生了什么

第一行相当于:

string temp = data.val != null ? data.val.ToLower() : null;
if ("x".Equals(temp)) { }
bool? temp = data.val != null ? data.val.ToLower().Equals("x") : null;
if (temp) { } //error
这是完全正确和明显的

第二种说法相当于:

string temp = data.val != null ? data.val.ToLower() : null;
if ("x".Equals(temp)) { }
bool? temp = data.val != null ? data.val.ToLower().Equals("x") : null;
if (temp) { } //error
这可能不太明显,但是如果data.val为null,语句data.val?.ToLower.Equalsx将返回null,否则它将返回data.val.ToLower.Equalsx的结果。因为语句可以返回null或bool,所以整个语句的类型是bool?但你不能用枪?在一个if中直接

正如其他人所指出的,转换布尔?去一家书店会解决你的问题。一种方法是使用GetValuerDefault:


如果为空,您将如何处理?这是什么可以用data.val返回?我认为,因为x等于return bool,而data.val?。。。。。可以返回null。空值不能转换成布尔值。我们团队中有个人称它为Evlis操作符已经好几个月了。我以为他是唯一一个我猜是因为data.val?是bool?,换句话说,它可以为null。因此,您可以执行x.Equalsnull,但如果val为null,则整个过程将计算为null。所以你需要像ifdata.val?.ToLower.Equalsx==true{}这样的东西。我建议你使用object.Equalsdata.val?.ToLower,x,而不必担心什么计算成什么。我同意,这个?。我会说不要跑剩下的。因此,当data.val为null时,返回null而不是bool。这个将使用false而不是null.or data.val?.ToLower.Equalsx.GetValueOrDefaultOr甚至data.val?.ToLower.Equalsx。这应被接受为答案。简言之,等于。。。返回一个bool但是?。可以返回空值。这意味着总的来说,两者的组合结果要么是bool,要么是null,即bool?nullable bool在ifNullable不是引用类型中不是有效的操作数,它是一个结构,即使它有一些不寻常的属性。@svick感谢您的更正。我从未意识到它是一个结构,因为我可以给它一个空值。我据此编辑了我的答案。