【问题标题】:Cannot implicity convert type 'int' to 'ushort' : already explicity cast无法将类型“int”隐式转换为“ushort”:已显式转换
【发布时间】:2013-09-18 20:53:24
【问题描述】:

我正在尝试将 int 显式转换为 ushort,但无法将类型 'int' 隐式转换为 'ushort'

ushort quotient = ((12 * (ushort)(channel)) / 16);

我正在使用 .Net Micro 框架,因此 BitConverter 不可用。为什么我首先使用 ushort 与我的数据如何通过 SPI 发送有关。我可以理解这个特定的错误之前已经在这个网站上提出过,但我不明白为什么当我明确声明我不在乎是否有任何数据丢失时,只需将 32 位切成 16 位,我会很高兴。

            public void SetGreyscale(int channel, int percent)
    {
        // Calculate value in range of 0 through 4095 representing pwm greyscale data: refer to datasheet, 2^12 - 1
        ushort value = (ushort)System.Math.Ceiling((double)percent * 40.95);

        // determine the index position within GsData where our data starts
        ushort quotient = ((12 * (ushort)(channel)) / 16); // There is 12 peices of 16 bits

我不希望将 int 频道更改为 ushort 频道。我该如何解决这个错误?

【问题讨论】:

    标签: c# .net-micro-framework


    【解决方案1】:

    任何int 和更小类型的乘法都会产生int。所以在你的情况下12 * ushort 产生int

    ushort quotient = (ushort)(12 * channel / 16);
    

    请注意,上面的代码并不完全等同于原始示例 - 如果 channel 的值超出 ushort 范围 (0.. 0xFFFF),则将 channel 转换为 ushort 可能会显着改变结果。如果它很重要,你仍然需要内部演员。下面的示例将为channel=0x10000 生成0(这是有问题的原始示例所做的),这与上面更常规的代码(给出49152 结果)不同:

    ushort quotient = (ushort)((12 * (ushort)channel) / 16); 
    

    【讨论】:

    • (ushort)channel 对第二条语句有何帮助?由于括号,我认为类型转换要等到数学运算之后才会发生。
    • @jmstoker 尝试使用int channel = 0x10000 - 第一个将作为int 倍增并产生49152,但第二个将0x10000 转换为ushort 第一个产生0(以及结果表达式是0)。请注意,这可能不是 OP 想要的,但原始帖子中的演员表使表达与我展示的第一个不同。
    • 这就是我认为会发生的事情。您的回答具有误导性。如果您将上面的评论添加到您的答案中并强调在第二个语句中转换 channel 不是最好的事情,那就更清楚了?
    • @jmstoker - 我已经编辑了答案......我不确定你的意思是“第二条语句中的投射频道不是最好的事情” -它会产生不同的结果,这可能是 OP 想要的,也可能不是 - 但我认为没有理由判断它是否更好。另请注意,关于将1216 除以4 的可能性也可以说类似,对于小数再次产生相同的结果,而对于大数则完全不同......有限的数字类型只是很难处理 - 长直播BigInteger :)
    • 你说得对,我不应该判断原意,感谢您更新您的帖子。我来自嵌入式世界,很少有你希望强制转换结果为零的情况。
    【解决方案2】:

    (ushort) channelushort12 * (ushort)(channel) 将是 int,请改为:

    ushort quotient = (ushort) ((12 * channel) / 16);
    

    【讨论】:

    • 非常感谢,这已经解决了问题。我想这意味着因为 12 是导致问题的 int ,还是它也是额外的括号?无论哪种情况,问题都已解决,我很高兴,非常感谢。
    • @Michael 是的,那是因为12int,所以结果会自动转换为越来越大类型。
    • @Michael - 请注意,King 的陈述并不完全正确 - 你得到 int 结果的原因是缺少 ushort*ushort 操作 - 只有 int*intlong*long,所以即使((ushort)12)*((ushort)channel) 将是 int。所有其他(+、-、/...)也是如此。
    • @AlexeiLevenkov 很遗憾知道这一点,我认为这不是问题所在,但是(我提到的)相同的规则适用于 intlong 等案例(int * long -> long)。其实我是在学c++的时候学的这个规则,不是c#,这里可能两者有一些区别。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多