三元运算符中出现意外行为
本文关键字:意外 运算符 三元 | 更新日期: 2023-09-27 18:10:02
当我为return语句将if-else改为三元运算符时,我遇到了一个奇怪的行为。
我在这里简化了代码:
class Foo
{
private bool condition;
private int intValue = 1;
private decimal decimalValue = 1M;
public object TernaryGet
{
get
{
return condition ? decimalValue : intValue;
}
}
public object IfElseGet
{
get
{
if (condition)
return decimalValue;
return intValue;
}
}
public Foo(bool condition)
{
this.condition = condition;
}
}
class Program
{
static void Main(string[] args)
{
var fooTrue = new Foo(true);
var fooFalse = new Foo(false);
Console.WriteLine("{0}, {1}", fooTrue.TernaryGet.GetType(), fooTrue.IfElseGet.GetType());
Console.WriteLine("{0}, {1}", fooFalse.TernaryGet.GetType(), fooFalse.IfElseGet.GetType());
}
}
其输出为:
System.Decimal, System.Decimal
System.Decimal, System.Int32
我希望第二行在两个getter上都输出Int32,但对于三进制,我为int返回了不正确的CLR类型。
别管代码和它试图做什么-我很好奇为什么会发生这种情况,所以如果有人能解释一下,我会很感激。
三元(条件(运算符的结果总是单一类型-其中一个/两个选项被强制转换为通用类型:
var result = condition ? decimalValue : intValue;
result
的类型在编译时必须是静态已知的。由于存在从int
到decimal
的转换,因此选择decimal
类型作为整个? :
运算符的类型。
所以你的整个函数可以写成(显示自动转换(:
public object TurnaryGet
{
get
{
/*decimal*/ var result = condition ? decimalValue : (decimal)intValue;
return (object)result;
}
}
condition ? decimalValue : intValue;
指
condition ? decimalValue : (decimal) intValue;
试试这个是否有效:(我对C#不熟悉,但它在Java中有效(
condition ? (object) decimalValue : (object) intValue;