【问题标题】:Why is comparing a struct to NULL legal in C#? [duplicate]为什么在 C# 中将结构与 NULL 进行比较是合法的? [复制]
【发布时间】:2012-04-22 07:11:26
【问题描述】:

可能重复:
C# okay with comparing value types to null

考虑以下带有 TimeSpan 的代码,它是一个结构体:

// will not compile - illegal
TimeSpan ts = null;  

但是,以下代码确实可以编译并且是合法的,尽管表达式总是错误的:

if (ts == null)
    Console.WriteLine("this line will never be hit");

谁能告诉我为什么将结构设置为 NULL 是无效的,但可以将其与一个进行比较?

【问题讨论】:

标签: c# struct null


【解决方案1】:

它仍然是合法的,因为您可以为structs 重载== 运算符。

struct AmNull {
    public static bool operator ==(AmNull a, object b) {
        return b == null;
    }

    public static bool operator !=(AmNull a, object b) {
        return b != null;
    }
}

...

Console.WriteLine(new AmNull() == null); // True

【讨论】:

  • @AngrHacker:我认为你应该选择这个回复作为接受的答案。它涵盖了我的回答,但对其进行了扩展以解释为什么会出现这种行为。
【解决方案2】:

无法为我编译:

struct Foo { }

class Program
{       
    static void Main( string[] args )
    {
        var f = new Foo();
        if( f == null ) { }
    }
}

错误 1 ​​运算符“==”不能应用于“ConsoleApplication3.Foo”和“null”类型的操作数

【讨论】:

  • @AngryHacker:这是因为TimeSpan 重载了== 运算符(一开始我没有注意到)。我的观点是您的问题“为什么在 C# 中将结构与 NULL 进行比较是合法的?”不完整;你不能,除非你重载相等运算符来接受它。 minitech 的反应更好。
猜你喜欢
  • 2017-09-25
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 2013-07-05
  • 1970-01-01
  • 2016-04-29
  • 1970-01-01
  • 2015-09-22
相关资源
最近更新 更多