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

本文关键字:xmax lt x+xsstep x+xstep 类型转换 不明显 | 更新日期: 2023-09-27 18:25:48

给定以下代码:

    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的转换发生在哪里?为什么?

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

将其分解。我们有

sum = expression

总和的类型为字节。表达式的类型是什么?把它分解。表达式为

summand1 + summand2

总和1的类型为字节。sumand2是什么类型的?把它分解。它是:

test ? consequence : alternative

测试类型为bool。备选方案的类型为字节。后果是什么类型的?把它分解!它是:

summand3 + summand4

这是字节+字节。Byte+Byte是int,所以结果是int类型。

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

所以sumand2的类型是int。所以sum等于一个字节加一个int。byte加int就是int,所以我们把int赋值给byte。这是一个显式转换,而不是隐式转换。

根据MSDN:,将byte添加到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);

这样行吗?

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,所以我想这才是真正的答案。

但是,我的版本编译时没有任何抱怨,只有一个演员阵容。