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