繁体   English   中英

IPv6:为什么更改System.Net.IPAddress的ScopeId不会反映在ToString()表示形式上?

[英]IPv6: Why changing ScopeId of System.Net.IPAddress is not reflected at ToString() representation?

昨天我遇到了一个看起来像.NET错误的东西。

IPAddress addr = IPAddress.Parse("fe80::1111:2222:abc%11"); // ScopeId is 11

string s1 = addr.ToString(); // I obviously see fe80::1111:2222:abc%11
addr.ScopeId = 0; // ScopeId is zero from now
string s2 = addr.ToString(); // I expect to see fe80::1111:2222:abc

为什么即使更改了ScopeId s1的内容仍与s2相同? 在调试器的“监视”窗口中,我看到范围值确实发生了变化。 但是内部字符串字段没有影响。

当然,我使用各种IPv6地址和不同的作用域ID进行了尝试-行为是相同的。 我错过了什么?

我将其称为.NET Framework中的错误。

如果查看IPAddress类的源代码:

http://referencesource.microsoft.com/#System/net/System/Net/IPAddress.cs

您会看到.ToString()方法实际上将结果缓存到名为m_ToString的私有字段中。 但是,如果您随后查看ScopeId属性的设置器,则会看到它更改了m_ScopeIdm_Address的私有字段,但不会清除m_ToString值。

如果查看Address属性,则会看到它们在设置该属性时清除了m_ToString字段。

如果您想解决这个问题,可以在这里进行以下操作:

如何确定两个IPv6地址之间的相等性?

通过使用.GetAddressBytes()方法传递给构造函数以创建新实例。 这将使您的ScopeId为零。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM