Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
奇C#三元算子行为_C#_Ternary Operator - Fatal编程技术网

奇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

所以我在今天的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语句之间存在差异

我发现的另一篇与之密切相关的帖子是这篇,但并不完全匹配:


三元算子是一种很好的算子,它只是一种特殊的方法。与任何其他方法一样,它只能有一个单一的返回类型

您试图做的是使用运算符根据条件返回一个
十进制数?
整数?
。这是不可能的


发生的情况是,编译器知道存在从
int?
decimal?
的隐式转换,但并非相反。因此,它将运算符的返回类型推断为
decimal?
,并隐式地将
intValue
转换为
decimal?

三元表达式返回单个类型,而不是以求值结果为条件的类型

为了满足这个要求,你的整数被提升为十进制

如果无法应用转换,则会出现编译器错误

第一个_表达式和第二个_表达式的类型必须相同,或者必须存在从一种类型到另一种类型的隐式转换


C#似乎从C继承了这种行为。感谢您的快速回答。我应该自己能弄明白的。今天是星期五,该喝鸡尾酒了!我讨厌人们这样做,如果(bool==false)。使用if(!bool)!!!!但是没有(bool==true)那么糟糕。@JSON-我讨厌人们在这里批评代码,如果从功能角度看,使用
if(!bool)
if(bool==false)
,代码没有任何区别。这是个人喜好,简单明了,完全是可读性的问题。有些人觉得
==false
更具可读性,有些则不然。我个人认为,在查看代码时,理解
==false
更为直截了当。很容易错过一个
符号。