当我将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,但是对于三元组,我得到的是不正确的CLR类型。
不要介意代码以及它正在尝试做什么 - 我很好奇为什么会这样,所以如果有人能解释它,我会很感激。
答案 0 :(得分:5)
三元(条件)运算符的结果总是单一类型 - 一个/两个选项都被转换为普通类型:
var result = condition ? decimalValue : intValue;
result
的类型必须在编译时静态知道。由于从int
转换为decimal
而非decimal
类型被选为整个? :
运算符的类型。
所以你可以将整个函数写成(显示自动强制转换):
public object TurnaryGet
{
get
{
/*decimal*/ var result = condition ? decimalValue : (decimal)intValue;
return (object)result;
}
}
答案 1 :(得分:2)
condition ? decimalValue : intValue;
装置
condition ? decimalValue : (decimal) intValue;
尝试这项工作:(我对C#更陌生,但这项工作是用Java编写的)
condition ? (object) decimalValue : (object) intValue;