gpt4 book ai didi

c# - 三元运算符中的意外行为

转载 作者:太空狗 更新时间:2023-10-30 00:42:21 24 4
gpt4 key购买 nike

当我将 if-else 更改为 return 语句的三元运算符时,我遇到了一个奇怪的行为。

我在这里简化了代码:

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;
}
}

关于c# - 三元运算符中的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16117068/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com