不明显的类型转换:x =(x + xstep< xmax?x + xstep:xmax)

时间:2012-02-24 22:24:20

标签: c# visual-studio

给出以下代码:

    byte x, xmin, xmax, xstep;
    x = (x + xstep < xmax ? x + xstep : xmax)

编译器告诉我

Cannot implicitly convert type 'int' to 'byte'. An explicit conversion exists (are you missing a cast?) 

从byte到int的转换发生在哪里?为什么?

3 个答案:

答案 0 :(得分:7)

分解。我们有

sum = expression

Sum的类型为byte。什么是表达方式?分解。表达是

summand1 + summand2

Summand1的类型为byte。 summand2是什么类型的?分解。它是:

test ? consequence : alternative

测试类型为bool。替代是字节类型。什么类型的后果?分解吧!它是:

summand3 + summand4

那是字节+字节。字节+字节是int,因此结果是int类型。

现在我们有足够的信息来计算summand2的类型。结果是int,替代是byte,而int是这两种类型中更常见的。 (因为每个字节都可以转换为int,但不是每个int都可以转换为byte。)

因此summand2的类型是int。所以我们总和等于一个字节加一个int。 Byte plus int是int,因此我们将int分配给byte。哪个是显式转换,而不是隐式转换。

答案 1 :(得分:6)

byte根据MSDN <{1}}向byte添加int

  

例如,考虑以下两个字节变量x和y:

    byte x = 10, y = 20;
     

以下赋值语句将产生编译错误,因为赋值运算符右侧的算术表达式默认情况下计算为int。

    // Error: conversion from int to byte:
    byte z = x + y;
     

要解决此问题,请使用强制转换:

    // OK: explicit conversion:
    byte z = (byte)(x + y);

答案 2 :(得分:0)

这会有用吗?

byte x, xmin, xmax, xstep;
// assign your variables x, xmin, xmax, and xstep,
// then...
x = ((x + xstep) < xmax) ? (byte)(x + xstep) : xmax;

你只需要投射那一部分,可能是因为 超过byte尺寸,但我不知道。

......或者真的在乎为什么。 :)

根据T.J.在那里,向byte添加byte会产生int,所以我猜这是真正的答案。

但是,我的版本编译时没有投诉,只有一个演员。