C# 为什么';从整数到字节的隐式转换是否使用条件运算符?

C# 为什么';从整数到字节的隐式转换是否使用条件运算符?,c#,windows-runtime,C#,Windows Runtime,for字节表示可以声明如下所示的字节: byte myByte = 255; 那 在前面的声明中,整数文本255是隐式的 从int转换为byte。如果整数文本超出范围 对于字节,将发生编译错误 因此,我很难理解为什么下面的代码会给我一个编译错误‘不能隐式地将类型‘int’转换为‘byte’) 如果有什么不同的话,我将在VS 2012上将其编译为Windows应用商店应用程序项目。因为: on ? 1 : 0 不是整数文本。它是一个返回整数的表达式。此外,在运行时之前无法计算此表达式 当存在文

for字节表示可以声明如下所示的字节:

byte myByte = 255;

在前面的声明中,整数文本255是隐式的 从int转换为byte。如果整数文本超出范围 对于字节,将发生编译错误

因此,我很难理解为什么下面的代码会给我一个编译错误‘不能隐式地将类型‘int’转换为‘byte’)

如果有什么不同的话,我将在VS 2012上将其编译为Windows应用商店应用程序项目。

因为:

on ? 1 : 0
不是整数文本。它是一个返回整数的表达式。此外,在运行时之前无法计算此表达式

当存在文本时,编译器可以在编译时对其进行计算,并确保它满足任何范围要求——正如页面所说,如果值超出范围,则由编译器生成错误

从你的同一封信:

不能将存储空间较大的非文字数字类型隐式转换为字节


根据@Jeppe Stig Nielsen的评论——如果值是常量,它也会起作用(它不必像第一页所说的那样是文本)。C#规格说明:

6.1.9隐式常量表达式转换

隐式常量表达式转换允许以下转换:

  • A
    int
    类型的常量表达式(§7.19)可以转换为
    sbyte
    byte
    short
    ushort
    uint
    ulong
    提供了 常量表达式在目标类型的范围内

  • A
    long
    类型的常量表达式可以转换为
    ulong
    类型, 如果常量表达式的值不是负值

因为:

on ? 1 : 0
不是整数文本。它是一个返回整数的表达式。此外,在运行时之前无法计算此表达式

当存在文本时,编译器可以在编译时对其进行计算,并确保它满足任何范围要求——正如页面所说,如果值超出范围,则由编译器生成错误

从你的同一封信:

不能将存储空间较大的非文字数字类型隐式转换为字节


根据@Jeppe Stig Nielsen的评论——如果值是常量,它也会起作用(它不必像第一页所说的那样是文本)。C#规格说明:

6.1.9隐式常量表达式转换

隐式常量表达式转换允许以下转换:

  • A
    int
    类型的常量表达式(§7.19)可以转换为
    sbyte
    byte
    short
    ushort
    uint
    ulong
    提供了 常量表达式在目标类型的范围内

  • A
    long
    类型的常量表达式可以转换为
    ulong
    类型, 如果常量表达式的值不是负值


使用显式转换有什么问题?谷歌搜索“C#三元类型”(不带引号)。最初的几次点击都是SO答案,它们都是指Eric Lippert的博客或他非常清楚的SO答案。最好的是(这里)[.三元数将返回一个int,并且您不会像之前的声明那样获得将该表达式转换为字节的神奇编译器帮助。如果
on
是编译时常量,这将起作用。例如,如果您有
const bool on=true;
。隐式转换从
int
byte
(缩小范围)是不可能的,除非你有一个编译时常数。仅仅使用显式转换有什么问题?谷歌搜索“C#Trimal type”(不带引号)。前几次点击的是SO答案,所有这些答案都指向Eric Lippert的博客或他非常清楚的SO答案。最好的是(这里)[.三元数将返回一个int,并且您不会像之前的声明那样获得将该表达式转换为字节的神奇编译器帮助。如果
on
是编译时常量,这将起作用。例如,如果您有
const bool on=true;
。隐式转换从
int
byte
(缩小)是不可能的,除非有编译时常量。