gpt4 book ai didi

c# - 为什么 IPAddress 有时会抛出 ArgumentOutOfRangeException?

转载 作者:太空狗 更新时间:2023-10-29 17:45:06 26 4
gpt4 key购买 nike

我只是想调试以下异常:

Exception has been thrown by the target of an invocation.: System.Reflection.TargetInvocationException: 
Exception has been thrown by the target of an invocation. --->
System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values.
Parameter name: newAddress
at System.Net.IPAddress..ctor(Int64 newAddress)

这是有问题的代码:

int hostToNetworkOrder = IPAddress.HostToNetworkOrder( (int)computer.IpAddress );
IPAddress ipAddress = new IPAddress( hostToNetworkOrder );

computer.IpAddress 设置为 1582281193。这将转换为 hostToNetworkOrder,即 -374255778

现在,如果我尝试在 Visual Studio 的即时窗口中构造 new IPAddress( -374255778 );,我会得到一个包含正确 IP 地址的 IPAddress 对象。

但是如果我越过代码中的行,它会总是抛出一个 ArgumentOutOfRangeException。为什么?


更新

我知道我的输入是否定的很可能是这个问题的根源。我就是这样解决的:

UInt32 hostToNetworkOrder = (UInt32)IPAddress.HostToNetworkOrder( (Int32)computer.IpAddress );
IPAddress ipAddress = new IPAddress( hostToNetworkOrder );

我仍然不明白的是为什么它在立即窗口中完全有效。

最佳答案

查看 ILSpy 中的 IPAddress 类,有一个内部构造函数接受一个 int 并且不执行参数超出范围检查 - 我有一种感觉,它可能在监 window 口中调用该构造函数,但在实际代码中它调用 public ctor(long),它验证该数字。

为了验证我的理论,我只是尝试了这段代码:

var ipAddress = (IPAddress) typeof (IPAddress)
.GetConstructor(
BindingFlags.NonPublic | BindingFlags.Instance,
null,
new[] {typeof (int)},
null)
.Invoke(new object[] {hostToNetworkOrder });

果然,IPAddress 类的构造没有错误。

关于c# - 为什么 IPAddress 有时会抛出 ArgumentOutOfRangeException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10087929/

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