Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
布尔表达式中的C#null或null条件运算符_C# - Fatal编程技术网

布尔表达式中的C#null或null条件运算符

布尔表达式中的C#null或null条件运算符,c#,C#,有人能给我解释一下为什么会这样吗 List<int> foo = null; bool bar = foo?.Count > 7; IntelliSense说null和7都属于null类型,但编译器是如何决定的 此外,Nullable不定义大于运算符。怎么可能呢?不能保证T定义了一个大于运算符。正如罗福斯和杰伦在评论中正确指出的,T到T之间的转换?当您与“Null”7进行比较时,它始终是隐式的,7将变为“可为Null” 类似于- 关于操作员的第二个问题。是的,虽然可空结构没有

有人能给我解释一下为什么会这样吗

List<int> foo = null;
bool bar = foo?.Count > 7;
IntelliSense说
null
7
都属于
null
类型,但编译器是如何决定的


此外,
Nullable
不定义大于运算符。怎么可能呢?不能保证
T
定义了一个大于运算符。

正如罗福斯和杰伦在评论中正确指出的,T到T之间的转换?当您与“
Null
”7进行比较时,它始终是隐式的,7将变为“
可为Null

类似于-

关于
操作员的第二个问题。是的,虽然
可空
结构没有定义诸如
之类的运算符,甚至没有定义
==
,但以下代码仍然正确编译并执行,这与您的情况类似-

int? x = 3;
int? y = 10;
bool b = x > y;
这是因为编译器
大于运算符从基础值类型(如-

bool b = (x.HasValue && y.HasValue) ? (x.Value > y.Value) : false;

运算符提升
或意味着您可以在T?上隐式使用T的运算符?。编译器在
Nullable
类型上处理它们时,在不同的操作符集上有不同的规则集。

因为
int
Nullable
之间有一个隐式转换,以及
null
Nullable
之间的转换,这是编译器为我们评估条件而做的(两个操作数必须是同一类型)
Nullable
很神奇;类型上的运算符会自动提升到相应的
Nullable
,而不需要显式运算符。语言规范对此有详细说明,但不是很容易访问(重载解析是最复杂的主题之一,要全面了解nullables的工作原理,您必须阅读多个不同的部分).FWIW是解释可空值上的运算符如何在没有明确定义的情况下工作的部分。@Andy:除了这不总是一个选项或不总是正确。
null>x
with
x
int
总是
false
,但是
。GetValueOrDefault()
给出
0
。在这种情况下(项目计数)
0
是一个完全合理的值,但首先允许可空值的全部原因当然是考虑到类型本身没有合理值的情况。(此外,
是一个问题,因此很少有任何理由调用该方法。)嗯,对于我们这些习惯于SQL和
NULL
的人来说,这种行为是显而易见的(除了与
NULL
比较相等/不相等与SQL中的情况不同,而是以简单的方式)。与往常一样,对于被认为令人困惑或不直观的常见功能,您通常需要了解它们是如何工作的,因为没有任何东西阻止其他开发人员使用它们。这并不是一个晦涩难懂的例子;它包含在语言中(更具体地说是LINQ)这是有原因的。语言规范明确了这意味着什么,不管怎样;你是否喜欢使用它是另一回事。
 int? count = null; 
 int? k = 7; // Implicit conversion here!
 var bar =  count > k;
int? x = 3;
int? y = 10;
bool b = x > y;
bool b = (x.HasValue && y.HasValue) ? (x.Value > y.Value) : false;