奇C#三元算子行为
所以我在今天的C#中遇到了本机三元运算符的一些非常令人困惑的行为。三元运算符向我调用的方法发送了错误的数据类型。基本前提是我想将十进制值转换为奇C#三元算子行为,c#,ternary-operator,C#,Ternary Operator,所以我在今天的C#中遇到了本机三元运算符的一些非常令人困惑的行为。三元运算符向我调用的方法发送了错误的数据类型。基本前提是我想将十进制值转换为int如果decimalEntry==false,那么它将作为int存储在数据库中。下面是代码: decimal? _repGroupResult = 85.00 int? intValue = null; bool decimalEntry = false; if (decimalEntry == false) { intValue = (in
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语句之间存在差异
我发现的另一篇与之密切相关的帖子是这篇,但并不完全匹配:
三元算子是一种很好的算子,它只是一种特殊的方法。与任何其他方法一样,它只能有一个单一的返回类型 您试图做的是使用运算符根据条件返回一个
十进制数?
或整数?
。这是不可能的
发生的情况是,编译器知道存在从
int?
到decimal?
的隐式转换,但并非相反。因此,它将运算符的返回类型推断为decimal?
,并隐式地将intValue
转换为decimal?
三元表达式返回单个类型,而不是以求值结果为条件的类型
为了满足这个要求,你的整数被提升为十进制
如果无法应用转换,则会出现编译器错误
第一个_表达式和第二个_表达式的类型必须相同,或者必须存在从一种类型到另一种类型的隐式转换
C#似乎从C继承了这种行为。感谢您的快速回答。我应该自己能弄明白的。今天是星期五,该喝鸡尾酒了!我讨厌人们这样做,如果(bool==false)。使用if(!bool)!!!!但是没有(bool==true)那么糟糕。@JSON-我讨厌人们在这里批评代码,如果从功能角度看,使用
if(!bool)
或if(bool==false)
,代码没有任何区别。这是个人喜好,简单明了,完全是可读性的问题。有些人觉得
比==false
更具可读性,有些则不然。我个人认为,在查看代码时,理解==false
更为直截了当。很容易错过一个代码>符号。