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

Ver*_*igo 1 c# visual-studio

鉴于以下代码:

    byte x, xmin, xmax, xstep;
    x = (x + xstep < xmax ? x + xstep : xmax)
Run Code Online (Sandbox Code Playgroud)

编译告诉我

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

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

Eri*_*ert 7

分解.我们有

sum = expression
Run Code Online (Sandbox Code Playgroud)

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

summand1 + summand2
Run Code Online (Sandbox Code Playgroud)

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

test ? consequence : alternative
Run Code Online (Sandbox Code Playgroud)

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

summand3 + summand4
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • Vertigo可能不知道的是byte + byte是int (2认同)

T.J*_*der 6

根据MSDN,在bytea中添加一个byte结果:int

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

    byte x = 10, y = 20;
Run Code Online (Sandbox Code Playgroud)

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

    // Error: conversion from int to byte:
    byte z = x + y;
Run Code Online (Sandbox Code Playgroud)

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

    // OK: explicit conversion:
    byte z = (byte)(x + y);
Run Code Online (Sandbox Code Playgroud)

  • @Vertigo:不同之处在于:人们*很可能*使用在添加时溢出一个字节的字节值,并且*非常不可能*处理添加时溢出的int值.如果你正在使用那么大的int,那么你应该首先使用longs. (3认同)