请告诉我某人,为什么这段代码(.Net 4.0):
IPAddress ip = IPAddress.Parse("0.0.0.0");
if (ip == IPAddress.Any) Console.WriteLine("any");
else Console.WriteLine("Not any");
Console.WriteLine(IPAddress.Any.ToString());
在控制台中显示下一个结果: 没有 0.0.0.0
答案 0 :(得分:11)
使用Equals
方法。
if (ip.Equals(IPAddress.Any))
答案 1 :(得分:1)
http://msdn.microsoft.com/ru-ru/library/ms173147(v=vs.80).aspx
根据MSDN(参见覆盖运营商== 部分):
默认情况下,运算符==测试引用相等性 确定两个引用是否表示相同的对象,因此引用 类型不需要实现operator ==以获得此功能 功能。
如图所示,IPAddress不会覆盖==运算符,您可以比较两个不同实例的引用。如前所述,您应该使用.Equals()
函数来比较两个IPAdress
实例。
答案 2 :(得分:0)
IPAddress.Any
是一个静态只读字段。 IPAddress
是一个类,因此当您尝试检查相等性时,他们会通过引用进行检查。这就是你出错的原因。尝试Equals()
方法。
提供指示服务器必须侦听的IP地址 所有网络接口上的客户端活动。
答案 3 :(得分:0)
出于Microsoft最熟悉的原因,当您请求对象级别比较时,框架使用其objectID而不是其值来评估IPAddress.Parse("0.0.0.0")
。也就是说,你问这两个是否是同一个对象(即指向存储值的内部指针)而不是相同的值。
但是,您可以使用Equals()
方法执行您要查找的内容:
IPAddress ipMine = IPAddress.Parse("0.0.0.0");
IPAddress ipAny = IPAddress.Any;
Console.WriteLine(ipMine == ipAny); // will output false
Console.WriteLine(ipMine.Equals(ipAny)); // will output true
框架在适当的时候将基本对象(int,float,string等)作为基元的内置隐式处理有时会破坏我们,并且总是值得记住,对于复杂类型,.NET默认会处理它们作为引用,除非作者明确地实现运算符方法。在上面的例子中,MS认为通过ref比较默认行为更有用,但是Equals
应该总是进行基于值的比较,所以你们都很好。