C# 为什么可以';我用三元运算符给十进制赋值吗?

C# 为什么可以';我用三元运算符给十进制赋值吗?,c#,.net,linq,C#,.net,Linq,我有一个对象列表(使用匿名类型),其中包含一个十进制和一个整数ID,我正在构建一个函数,以获取列表中所有唯一对象中包含的小数总和 这是我写的一行代码: var result = (objectList.Any()) ? objectList.Distinct().Sum(x => x.DecimalValue) : 0; 但是,它总是返回一个值为0的十进制数,即使它应该返回sum-在我的示例中,objectList包含五个相同的对象,因此它应该返回十进制值 但是,如果我将其替换为这两行代

我有一个对象列表(使用匿名类型),其中包含一个十进制和一个整数ID,我正在构建一个函数,以获取列表中所有唯一对象中包含的小数总和

这是我写的一行代码:

var result = (objectList.Any()) ? objectList.Distinct().Sum(x => x.DecimalValue) : 0;
但是,它总是返回一个值为
0
的十进制数,即使它应该返回sum-在我的示例中,objectList包含五个相同的对象,因此它应该返回十进制值

但是,如果我将其替换为这两行代码,它将返回小数值:

decimal result = 0;
if (objectList.Any()) result = objectList.Distinct().Sum(x => x.DecimalValue);
为什么第二组行可以工作,但第一行返回错误的值
objectList.Any()
为true,因此不应使用false赋值

更新:我使用以下代码行生成了匿名类型列表:

var objectList = _ms.Read(cmd, x => new { DecimalValue = x.Field<decimal>("SomeColumnName"), Id = x.Field<int>("SomeColumnId") }).ToList();
我还尝试将强制转换删除为十进制,但问题仍然存在

另一个更新:经过进一步调试后,我意识到一些我以前从未遇到过的东西。我在我提到的每种情况下都有问题的代码行之后立即设置了一个断点。对于解决方案,返回31.45。对于问题行,它返回0。当我进入下一行,再次查看变量时,它显示为31.45。我设置断点的行没有访问或修改变量


这两行代码似乎都可以工作,但调试器显示,直到我在代码之后移动了至少两行代码,调试器才可以工作。我以前从未遇到过这种情况,但它表明代码确实有效。

您的声明没有问题

问题在别处,很可能是在如何构造
objectList

例如,以下内容完全按照预期工作,并打印“0.6”(如预期):


更新:

作为对您的更新的响应,这也非常有效:

private static void Main(string[] args)
{
    var objectList = Enumerable.Range(0, 5).Select(i => new { DecimalValue = (decimal)31.45, Id = 3 }).ToList();
    var result = (objectList.Any()) ? objectList.Distinct().Sum(x => x.DecimalValue) : 0;

    Console.WriteLine(result);
    Console.ReadKey();
}

它使用的是您粘贴的确切代码,并按预期报告
31.45
(由于唯一约束)。请注意,就我个人而言,我会使用
31.45m
而不是演员阵容,但它甚至可以像写的那样工作…

值得一提的是,您的代码可以工作,尽管我必须自己编写类型

[Test]
public void X()
{
    var objectList = Enumerable.Range(1, 10).Select(d => new {DecimalValue = Convert.ToDecimal(d)});

    var result = (objectList.Any()) ? objectList.Distinct().Sum(x => x.DecimalValue) : 0;

    Assert.AreEqual(55, result);
    Assert.AreEqual(typeof (decimal), result.GetType());
}

注释太大了,所以它是CW。

我刚刚编译了一段代码

    public class ObjectValue
    {
        public Decimal DecimalValue { get; set; }
    }

    class Program
    {

        static void Main(string[] args)
        {
            var objectList = new List<ObjectValue>() { new ObjectValue() { DecimalValue = 5 }, new ObjectValue() { DecimalValue = 5 } ,
                    new ObjectValue() { DecimalValue = 5 }};


            var result = (objectList.Any()) ? objectList.Distinct().Sum(x => x.DecimalValue) : 0;

            decimal resultDecimal = 0;
            if (objectList.Any())
                resultDecimal = objectList.Distinct().Sum(x => x.DecimalValue);

        }
    }
公共类ObjectValue
{
公共十进制小数值{get;set;}
}
班级计划
{
静态void Main(字符串[]参数)
{
var objectList=new List(){new ObjectValue(){DecimalValue=5},new ObjectValue(){DecimalValue=5},
新的ObjectValue(){DecimalValue=5}};
var result=(objectList.Any())?objectList.Distinct().Sum(x=>x.DecimalValue):0;
十进制结果decimal=0;
if(objectList.Any())
resultDecimal=objectList.Distinct().Sum(x=>x.DecimalValue);
}
}

在我的例子中,
result
resultDecimal
15
。正如我所期望的,我在这两种情况下都得到了一致的结果。因此,错误在其他地方。

赋值后,
var结果的类型是什么?C#是否可能从三元表达式推断出不正确的类型(比如
int
)?objectList
包含什么?如果将其定义为
var objectList=newlist{5,5,5,5}
我得到的
5
是三元表达式的结果(显然已删除
小数
),因此它与类型有关。我们需要查看列表中包含的内容。你能发布构建
objectList
的代码吗?你必须发布一个小的、完整的、实际编译的repo。给出的代码很好。对于一个完全神秘和不清楚的问题,我并不真正理解所有这些问题。@SaeedAmiri,这很好-在我看来,这是一个非常有价值的答案,因为它证明问题不是OP怀疑的,而是他代码中其他地方发生的事情。这是你的想法,可能是错误的,但在我看来,有50%的人对问题或错误答案发表了评论,他们知道这不是问题。@SaeedAmiri:但显然OP没有。@SaeedAmiri的评论没有起作用。我做了一个完整的复制,精确地展示了OP所描述的内容,以及它是如何正确工作的。这远远超出了评论的范围…@SaeedAmiri:嗯。。。我想你的意思是“哑巴”,不是“垃圾场”,但我不知道。我所知道的是,OP在发布问题之前,并没有区分他的案例和更简单的案例。他认为这是三元的问题,但事实并非如此。我怎么能假设他知道问题不是三元的,而他的问题不是三元的?
[Test]
public void X()
{
    var objectList = Enumerable.Range(1, 10).Select(d => new {DecimalValue = Convert.ToDecimal(d)});

    var result = (objectList.Any()) ? objectList.Distinct().Sum(x => x.DecimalValue) : 0;

    Assert.AreEqual(55, result);
    Assert.AreEqual(typeof (decimal), result.GetType());
}
    public class ObjectValue
    {
        public Decimal DecimalValue { get; set; }
    }

    class Program
    {

        static void Main(string[] args)
        {
            var objectList = new List<ObjectValue>() { new ObjectValue() { DecimalValue = 5 }, new ObjectValue() { DecimalValue = 5 } ,
                    new ObjectValue() { DecimalValue = 5 }};


            var result = (objectList.Any()) ? objectList.Distinct().Sum(x => x.DecimalValue) : 0;

            decimal resultDecimal = 0;
            if (objectList.Any())
                resultDecimal = objectList.Distinct().Sum(x => x.DecimalValue);

        }
    }