gpt4 book ai didi

c# - IPv6:为什么更改 System.Net.IPAddress 的 ScopeId 没有反射(reflect)在 ToString() 表示中?

转载 作者:太空宇宙 更新时间:2023-11-03 10:59:50 25 4
gpt4 key购买 nike

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

可以肯定的是,我尝试使用各种 IPv6 地址和不同的范围 ID - 行为是相同的。我错过了什么?

最佳答案

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

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

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

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

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

如果你想变通,你可以按照他们在这里做的:

How do you determine equality between two IPv6 addresses?

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

关于c# - IPv6:为什么更改 System.Net.IPAddress 的 ScopeId 没有反射(reflect)在 ToString() 表示中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18122303/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com