3

昨天我遇到了一个看起来像 .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

为什么更改后的s1内容还是一样的?在调试器监视窗口中,我看到范围值确实发生了变化。但内部字符串字段没有影响。s2ScopeId

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

4

1 回答 1

2

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

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

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

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

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

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

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

通过使用该.GetAddressBytes()方法传递给构造函数来创建一个新实例。这会给你一个ScopeId零。

于 2014-08-22T17:24:59.817 回答