所以我今天在C#中遇到了本地三元运算符的一些非常令人困惑的行为。三元运算符正在向我正在调用的方法发送错误的数据类型。基本前提是我想将小数值转换为int
如果decimalEntry == false
,那么它将作为int
存储在数据库中。以下是代码:
decimal? _repGroupResult = 85.00
int? intValue = null;
bool decimalEntry = false;
if (decimalEntry == false)
{
intValue = (int?) _repGroupResult;
}
Console.WriteLine("Sending to ResultAdd via ternary operator");
RepGBParent.ResultAdd(this.RepInfo.ResultID, decimalEntry ? _repGroupResult : intValue);
Console.WriteLine("Sending to ResultAdd via if statement");
// All other tests - just add the rep group result
if (decimalEntry)
{
RepGBParent.ResultAdd(this.RepInfo.ResultID, _repGroupResult);
}
else
{
RepGBParent.ResultAdd(this.RepInfo.ResultID, intValue);
}
我正在调用ResultAdd
的方法是:
public void ResultAdd(int pResultID, object pResultValue)
{
if (pResultValue == null) { return; }
Console.WriteLine(this.TestInfo.TestNum + ": " + pResultValue.GetType());
....
}
当decimal
语句发送if
时,三元运算符会收到int
。如下面的输出代码所示:
我认为自己是一个合理人才的程序员,这真的让我今天回来了。我玩了2-3个小时,想出了最好的发布方式,所以我很清楚我遇到的问题。
请避免“你为什么这样做”的类型回复。我只是想知道为什么三元运算符和if语句之间存在差异。
我发现的唯一一个密切相关的帖子就是这个帖子,但它并不完全匹配:
Bizarre ternary operator behavior in debugger on x64 platform
答案 0 :(得分:8)
三元运算符 - 是 - 运算符,它只是一种特殊的方法。和任何其他方法一样,它只能有一个返回类型。
您尝试执行的操作是根据条件使用运算符返回decimal?
或 int?
。这是不可能的。
编译器知道存在从int?
到decimal?
的隐式转换,但反之则不然。因此,它将运算符的返回类型推断为decimal?
,并隐式将intValue
转换为decimal?
。
答案 1 :(得分:4)
三元表达式返回单个类型,而不是以评估结果为条件的类型。
你的int被提升为十进制,以满足这个要求。
如果无法应用转换,则会出现编译错误。
first_expression和second_expression的类型必须相同,或者从一种类型到另一种类型必须存在隐式转换。