【发布时间】:2017-07-30 03:03:00
【问题描述】:
对代码进行一些更改,我使用下一行:
uint a = b == c ? 0 : 1;
Visual Studio 向我显示此错误:
无法将类型“int”隐式转换为“uint”。存在显式转换(您是否缺少演员表?)
但是如果我使用代码:
uint a;
if (b == c)
a = 0;
else
a = 1;
它可以正常工作,没有任何错误或警告。为什么?
【问题讨论】:
-
(b == c) ? 0U : 1U可以。这是由于直接分配给变量时整数文字发生的隐式转换。但是当你使用三元运算符时,编译器不会进行隐式转换,只会检查两个分支是否可以转换为相同的类型。 -
避免此问题的更好方法是首先不使用 uint。你为什么使用uint?这是 C# 中不好的代码气味。 uint 用于与使用 uint 的 C 和 COM 库进行互操作。
-
@JakeMillington:此外,如果您的数量通常超过 20 亿,那么看在上帝的份上,请使用 long。当你认为总是小于 40 亿的数量突然变成 50 亿,并且 uint 换行时,你真的要花一分钟调试问题吗?
-
@JakeMillington:但是等等,还有更多。假设我们有两个逻辑上永远不会为负的量。例如,字符串的大小。好的,我这么说:
string.Length现在是uint。现在请正确地为我编写接受两个字符串并给出它们长度差异的代码。您认为您多久会忘记将演员表添加到 int 中?您认为该错误会导致严重故障需要多长时间?现在我们有了一个程序,它在市场上的失败是由于使用了 uint! uint 与我们日常工作的数学领域不匹配。 -
@JakeMillington:long 是 8 个字节。一个 int 是四。您至少有 20 亿字节的地址空间。你有超过一亿多头吗?如果是这样,那就开始担心它。你是记忆亿万富翁;不用担心一分钱。
标签: c# .net type-conversion