我想知道为什么以下代码在C#6.0中有效:
(在此示例中, data 是一个包含 val 作为公共字符串的随机类)
if ("x".Equals(data.val?.ToLower()) { }
但以下行不是:
if (data.val?.ToLower().Equals("x")) { }
Visual Studio向我显示以下错误:
无法隐式转换类型'bool?' 'bool'。存在显式转换(您是否错过了演员?)
答案 0 :(得分:7)
profileId
最终将返回一个布尔值,因为Equals
调用但是:
if ("x".Equals(data.val?.ToLower()) { }
当表达式被计算时,它将返回System.Nullable<bool>
,它不同于if (data.val?.ToLower().Equals("x")) { }
(前者是可以赋值bool
的结构,而后者只能是null
{1}}或true
)false
期望。此外,在C#中,if
值不会被评估为false(根据C#规范)。
答案 1 :(得分:3)
我没有c#6.0来测试,但这应该可行
if (data.val?.ToLower().Equals("x") ?? false) { }
答案 2 :(得分:2)
第一个语句是评估Equals
的返回值,而第二个语句评估为bool?
,可能为null。
答案 3 :(得分:1)
除了其他答案之外,我认为如果您长时间编写相同的代码,那么它很有用,这样您就可以看到正在发生的事情。
第一行相当于:
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?.ToLower().Equals("x")
为null
,则data.val
语句将返回null
,否则会返回data.val.ToLower().Equals("x")
的结果。由于该语句可以返回null
或bool
,因此整个语句的类型为bool?
,但您无法直接在bool?
中使用if
正如其他人所指出的那样,将bool?
转换为bool
会解决您的问题。一种方法是使用GetValueOrDefault()
:
if (data.val?.ToLower().Equals("x").GetValueOrDefault()) { }