1

我有两个变量。

int x = 1;
uint y = 2;

类型必须保持intuint。但是我不能用它们进行基本的算术运算。

y += x;

无法将类型“int”隐式转换为“uint”。存在显式转换(您是否缺少演员表?)

所以我每次都必须做这样的事情?

if (x < 0)
{
    y -= (uint)Math.Abs(x);
}
else
{
    y += (uint)x;
}

来自 C/C++/Java 背景,这让我很困惑。
我在这里缺少什么吗?

为什么这种行为与提到的其他语言不同?
有更好的选择吗?

我认为这是该语言新手的常见绊脚石。
不,我不依赖下溢。

4

1 回答 1

2

无法保证 anint适合 an uint,这就是您收到编译器错误的原因。

如果您真的想执行该操作(也就是说,如果您知道数字适合),您可以像以前一样进行转换或使用Convert方法。

if (x < 0)
{
    y -= Convert.ToUint32(Math.Abs(x));
}
else
{
    y += Convert.ToUint32(x);
}

如果你不确定这些数字是否合适,你可以夹住它们:

uint result = Math.Max(uint.MinValue(Math.Min(uint.MaxValue, x))

此外,在某些情况下,您可以使用unchecked上下文。这不会给您错误,但会溢出大于可能适合的值。

最后,如果要在它们的可能值范围之间进行映射,请int.MaxValue用作偏移量:

uint x = someuint();
int y = Convert.ToInt32(x - int.MaxValue);

int w = someint();
uint z = Convert.ToUint32(w + int.MaxValue);
于 2016-03-31T02:29:38.367 回答