3

我有以下代码,它工作正常:

var firstChild = token.First as JProperty;
bool isHref = token.Children().Count() == 1
           && firstChild?.Name == "href";

我想让字符串比较不区分大小写,所以我将其更改为:

var firstChild = token.First as JProperty;

bool isHref = token.Children().Count() == 1
           && firstChild?.Name.Equals("href", StringComparison.OrdinalIgnoreCase);

现在编译器给了我一个错误:

运算符 && 不能应用于 'bool' 和 'bool?' 类型的操作数?

我可以通过合并为 false 来修复错误

bool isHref = token.Children().Count() == 1
         && (firstChild?.Name.Equals("href", StringComparison.OrdinalIgnoreCase) ?? false);

但我很好奇为什么编译器不喜欢第一个空条件语法。

4

2 回答 2

5

让我们简化为要点。

string x = null, y = null;

// this is null.  b1 is bool?
var b1 = x?.Equals(y); 

// b2 is bool
// this is true, since the operator doesn't require non-null operands
var b2 = x == y;

基本上.Equals()需要一个非空对象来操作。这与==静态绑定而不是动态调度的 不同。

于 2015-08-24T19:21:36.983 回答
2

第一个表达式返回 null 或 bool

如果 firstChild 为 null 则返回值为 null 并且不能在 if 条件中使用

firstChild?.Name.Equals("href", StringComparison.OrdinalIgnoreCase)

将与

firstChild == null ? null : firstChild.Name.Equals("href", StringComparison.OrdinalIgnoreCase)
于 2015-08-24T19:09:52.723 回答