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

C# IPv6:为什么更改System.Net.IPAddress的ScopeId不会反映在ToString()表示中?,c#,ipv6,C#,Ipv6,昨天我遇到了一个似乎是.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

昨天我遇到了一个似乎是.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
的内容与
s2
的内容相同,即使
ScopeId
发生了更改?在调试器监视窗口中,我看到范围值确实发生了变化。但内部字符串字段没有影响


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

我会称之为.NET Framework中的错误

如果查看IPAddress类的源代码:

您将看到
.ToString()
方法实际上将结果缓存到名为
m_-ToString
的私有字段中。但是,如果随后查看
ScopeId
属性的setter,您会看到它更改了
m\u ScopeId
m\u Address
的私有字段,但它没有清除
m\u ToString

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

如果你想改变现状,你可以像他们在这里做的那样:


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

我打开了以下Microsoft Connect错误: