2012-04-09 104 views
1

可能重复:
C# okay with comparing value types to null为什么要在C#中将结构与NULL合法比较?

考虑与时间跨度,这是一个结构下面的代码:

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

但是,下面的代码不会编译和合法,尽管表达总是假的:

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

有人可以告诉我为什么将结构设置为NULL是无效的,但可以将它与一个结果比较吗?

+0

http://stackoverflow.com/questions/2022425/comparing-structs-to-null,http://stackoverflow.com/questions/648115/how-can-an-object-not-be-比较为null,http://stackoverflow.com/questions/1225949/why-can-timespan-and-guid-structs-be-compared-to-null,http://stackoverflow.com/questions/1972262/ c-sharp-okay-with-comparison-value-types-null- – nawfal 2012-04-09 23:44:31

+0

如果无法将结构与null进行比较,那么将如何处理Nullable ? – 2012-04-09 23:46:19

+0

@AnthonyPegram:更好的问题是;你将如何实现'Nullable '作为'struct'? (当然,你不能)。 'Nullable ''当然可以作为参考类型来实现 – 2012-04-10 00:02:06

回答

3

编译失败对我来说:

struct Foo { } 

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

错误1操作 '==' 不能应用于类型 'ConsoleApplication3.Foo' 和 '空' 的操作数

+0

尝试TimeSpan而不是Foo – AngryHacker 2012-04-09 23:44:34

+0

@AngryHacker:这是因为'TimeSpan'重载'=='操作符(我一开始并没有明白)。我的观点是你的问题“为什么要在C#中将结构与NULL合法比较?”不完整;你不能,除非你让相等运算符超载来接受它。 minitech有更好的反应。 – 2012-04-09 23:45:39

7

它仍然合法,因为您可以为struct s重载==运营商。

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 
+3

@AngrHacker:我想你应该选择这个答案作为接受的答案。它涵盖了我的回应,但扩展了它的解释为什么会出现这种行为。 – 2012-04-10 17:00:48