gpt4 book ai didi

c# - 为什么 integer == null 在 C# 中是一个有效的 boolean 表达式?

转载 作者:可可西里 更新时间:2023-11-01 08:38:11 25 4
gpt4 key购买 nike

如果 integer(int 类型的变量)不可为空,为什么 integer == null 在 C# 中是一个有效的 boolean 表达式? (我不反对,其实我也喜欢,只是我不知道可以)

最佳答案

尽管 int 本身是不可空的,但存在到 int? 的隐式转换,可空的。

此时,如果该结构在两侧都声明了具有相同类型的 == 运算符,那么它也将被提升以处理可为 null 的类型。

所以这不能编译:

public struct Foo {}

class Test
{
static void Main()
{
Foo x = new Foo();
if (x == null)
{
...
}
}
}

...但是如果您给 Foo 一些运算符,它编译,并且没有警告:

public struct Foo
{
public static bool operator ==(Foo x, Foo y) { return true; }
public static bool operator !=(Foo x, Foo y) { return false; }
public override bool Equals(object x) { return false; }
public override int GetHashCode() { return 0; }
}

运算符调用不包含在编译后的代码中,因为编译器知道 RHS 为空。

因此,上述形式的代码(其中 Foo 可以替换为任何不可为 null 的 struct)在 MS C# 5 编译器中具有以下三种结果之一:

  • 警告 CS0472(例如使用 int)
  • 错误 CS0019(不重载 == 的自定义类型)
  • 清理编译(重载 == 的自定义类型,包括 GuidDateTime)

我不清楚为什么编译器会以不同于普通结构的方式对待某些“已知”类型。编辑:正如 Eric 在评论中指出的那样,这是 C# 编译器中的一个已知错误,希望在 Roslyn 中得到修复。

关于c# - 为什么 integer == null 在 C# 中是一个有效的 boolean 表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17179519/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com