试图理解? C# 中的(空条件)运算符
Trying to understand ?. (null-conditional) operator in C#
我有这个非常简单的例子:
class Program
{
class A
{
public bool B;
}
static void Main()
{
System.Collections.ArrayList list = null;
if (list?.Count > 0)
{
System.Console.WriteLine("Contains elements");
}
A a = null;
if (a?.B)
{
System.Console.WriteLine("Is initialized");
}
}
}
if (list?.Count > 0)
行编译完美,这意味着如果 list
是 null
,则表达式 Count > 0
默认变为 false
。
但是,行 if (a?.B)
抛出一个编译器错误,提示我无法将 bool?
隐式转换为 bool
。
为什么一个与另一个不同?
list?.Count > 0
:在这里你将 int?
与 int
进行比较,得到 bool
,因为 lifted comparison operators return a bool
, not a bool?
.
a?.B
:在这里,你有一个bool?
。然而,if
需要 bool
.
在您的第一种情况 (list?.Count
) 中,运算符 return 是一个 int?
- 可为空的 int
.
>
运算符是为可为空的整数定义的,因此如果 int?
没有值(为空),比较将 return false
.
在您的第二个示例 (a?.B
) 中 bool?
被 return 编辑(因为如果 a
为空,则 true
和 false
但 null
是 returned)。并且 bool?
不能在 if
语句中使用,因为 if
语句需要(不可为 null)bool
.
您可以将该语句更改为:
if (a?.B ?? false)
让它重新工作。因此,空合并运算符 (??
) returns false
当空条件运算符 (?.
) returned null
.
或者(如 TheLethalCoder 建议的那样):
if (a?.B == true)
我有这个非常简单的例子:
class Program
{
class A
{
public bool B;
}
static void Main()
{
System.Collections.ArrayList list = null;
if (list?.Count > 0)
{
System.Console.WriteLine("Contains elements");
}
A a = null;
if (a?.B)
{
System.Console.WriteLine("Is initialized");
}
}
}
if (list?.Count > 0)
行编译完美,这意味着如果 list
是 null
,则表达式 Count > 0
默认变为 false
。
但是,行 if (a?.B)
抛出一个编译器错误,提示我无法将 bool?
隐式转换为 bool
。
为什么一个与另一个不同?
list?.Count > 0
:在这里你将int?
与int
进行比较,得到bool
,因为 lifted comparison operators return abool
, not abool?
.a?.B
:在这里,你有一个bool?
。然而,if
需要bool
.
在您的第一种情况 (list?.Count
) 中,运算符 return 是一个 int?
- 可为空的 int
.
>
运算符是为可为空的整数定义的,因此如果 int?
没有值(为空),比较将 return false
.
在您的第二个示例 (a?.B
) 中 bool?
被 return 编辑(因为如果 a
为空,则 true
和 false
但 null
是 returned)。并且 bool?
不能在 if
语句中使用,因为 if
语句需要(不可为 null)bool
.
您可以将该语句更改为:
if (a?.B ?? false)
让它重新工作。因此,空合并运算符 (??
) returns false
当空条件运算符 (?.
) returned null
.
或者(如 TheLethalCoder 建议的那样):
if (a?.B == true)