Har*_*rry 1 .net c# ascii ternary
我最近遇到了以下代码行。
public class Program
{
public static void Main(string[] args)
{
char x = 'X';
int i = 0;
Console.WriteLine (true ? x : 0);
Console.WriteLine(false ? i : x);
}
}
Run Code Online (Sandbox Code Playgroud)
据我所知,上面的代码在这两种情况下都应该输出字符“X”;但是,当我执行代码时,我在控制台中得到了 88;谁能帮我理解为什么输出是 ASCII 代码而不是字符?
三元运算符有它自己的类型。这并不总是与您传递给语句的两个操作数的类型相同。相反,它是两个分支都可以转换为的类型。在这种情况下,char具有到 的隐式转换int。这意味着三元语句类型是int. 请参阅下面的示例。该(true ? x : 0).GetType()语句显示了整个三元语句如何具有int类型。
public class Program
{
public static void Main(string[] args)
{
char x = 'X';
int i = 0;
// Prints X fine
Console.WriteLine(x);
// Prints System.Int32
Console.WriteLine((true ? x : 0).GetType());
// Both print 88 - the int value of 'X'
Console.WriteLine(true ? x : 0);
Console.WriteLine(false ? i : x);
}
}
Run Code Online (Sandbox Code Playgroud)
编译器选择int而不是的“为什么”char有点复杂。的C#规范定义了一个char隐式转换为ushort,int,uint,long,float,double,和decimal。它还表示任何数字类型都可以显式转换为char. 这是关键的区别。因为从charto的转换int是隐式的(它不需要强制转换),编译器将它用于三元并忽略另一个方向的潜在转换。您可以在此处阅读有关确定三元语句类型的规则的更多信息。
| 归档时间: |
|
| 查看次数: |
207 次 |
| 最近记录: |