为什么在C#中将结构与NULL进行比较是合法的?
可能重复:为什么在C#中将结构与NULL进行比较是合法的?,c#,struct,null,C#,Struct,Null,可能重复: 考虑以下带有TimeSpan的代码,它是一个结构: // will not compile - illegal TimeSpan ts = null; 但是,以下代码确实可以编译并且是合法的,尽管表达式始终为false: if (ts == null) Console.WriteLine("this line will never be hit"); 有人能告诉我为什么将结构设置为空是无效的,但将其与空进行比较是可以的吗?无法为我编译: struct Foo { }
考虑以下带有TimeSpan的代码,它是一个结构:
// will not compile - illegal
TimeSpan ts = null;
但是,以下代码确实可以编译并且是合法的,尽管表达式始终为false:
if (ts == null)
Console.WriteLine("this line will never be hit");
有人能告诉我为什么将结构设置为空是无效的,但将其与空进行比较是可以的吗?无法为我编译:
struct Foo { }
class Program
{
static void Main( string[] args )
{
var f = new Foo();
if( f == null ) { }
}
}
错误1运算符“==”不能应用于“ConsoleApplication3.Foo”和“null”类型的操作数
它仍然是合法的,因为您可以为
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
,若你们不能将结构和null进行比较,那个么你们会如何处理null?@AnthonyPegram:更好的问题是;如何将
Nullable
实现为struct
?(当然,你不能)<代码>可空当然可以作为参考实现type@EdS.但是Nullable
是一个结构体。@phoog:对,这就是我的意思:)@AngryHacker:这是因为TimeSpan
重载了=
操作符(一开始我没有捕捉到)。我的观点是,你的问题“为什么在C#中将结构与NULL进行比较是合法的?”是不完整的;不能,除非重载相等运算符以接受它。minitech有更好的回答。@AngrHacker:我认为你应该选择这个回答作为公认的答案。它涵盖了我的回答,但进一步解释了为什么会出现这种行为。