IPv6:为什么更改System.Net.IPAddress的ScopeId没有反映在ToString()表示中

本文关键字:ToString 表示 ScopeId 为什么 System IPAddress Net IPv6 | 更新日期: 2023-09-27 18:26:47

昨天我遇到了一个.NET bug。

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中尝试过这种方法——行为是相同的。我错过了什么?

IPv6:为什么更改System.Net.IPAddress的ScopeId没有反映在ToString()表示中

我认为这是.NET Framework中的一个bug。

如果您查看IPAddress类的源代码:

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

您将看到.ToString()方法实际上将结果缓存到一个名为m_ToString的私有字段中。但是,如果查看ScopeId属性的setter,会发现它更改了m_ScopeIdm_Address的私有字段,但没有清除m_ToString值。

如果查看Address属性,您会发现在设置该属性时,它们会清除m_ToString字段。

如果你想解决问题,你可以做他们在这里做的事情:

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

通过使用CCD_ 11方法传递给构造函数来创建新实例。这将使您的ScopeId为零。