none
decimal?类型的值无法累加,求解决方案。 RRS feed

  • 问题

  • 大家好。我想将decimal?类型的数据累加,如果为空的话,就不参加累加,最后的返回结果要求是:如果累加结束后,确有数据,就返回数据,没仍然为空就返回null,但不能返回0。然后我就发现decimal?的数据无法累加。这个问题以前没遇到过,请大家帮帮忙。

    写了个简单的例子,来说我遇到的问题。具体情况如下:

    新建一个类,包含有一个类型为decimal?的属性:

    public class MyClass
        {
            public MyClass(decimal? src)
            {
                this.Amount = src;
            }
    
            public decimal? Amount { set; get; }
    
        }

    然后新建一个窗口应用程序,在窗口上面放一个TextBox控件。双击窗体,编写一个返回自定义类集合的方法。

    private IList<MyClass> MyMethod()
            {
                return new List<MyClass>()
                {
                    new MyClass(null),
                    new MyClass(2),
                    new MyClass(-4),
                    new MyClass(null),
                };
            }

    然后编写调用这个方法的函数:

    private void Form1_Load(object sender, EventArgs e) { textBox1.Text = Cal().ToString(); } private decimal? Cal() { var result = new decimal?(); var recordList = MyMethod(); //返回一个 IList<MyClass> foreach (MyClass item in recordList) { if (item.Amount == null) //自定义的类MyClass有个Amount属性,其类型也是decimal? continue; //数据为空,则不参与累加。 result += item.Amount; //主要是这个地方,无法累加,请各位帮忙解释下 }

    //如果没有累加,就返回null,如果有累加,就返回累加后的值。这就是我想达到的目的,不能为空时返回0 return result; }

    运行,没有报错,但发现TextBox为空。这是什么原因啊?


    2015年3月24日 11:23

答案

  • 你好:

    你在Cal方法里面定义了一个新的decimal?类型的变量result并且开始没有赋值,所以result的默认值为null,null和任何类型实例相加都是null,所以ToString之后为空。

    将Cal方法修改一下就可以了:

    private decimal? Cal()
            {
                decimal result = 0.0m;
    
                var recordList = MyMethod(); //返回一个 IList<MyClass>
                foreach (MyClass item in recordList)
                {
                    if (item.Amount == null) //自定义的类MyClass有个Amount属性,其类型也是decimal?
                        continue;  //数据为空,则不参与累加。
                    result += item.Amount.Value; //主要是这个地方,无法累加,请各位帮忙解释下
                }
    
                //如果没有累加,就返回null,如果有累加,就返回累加后的值。这就是我想达到的目的,不能为空时返回0
                return result;
            }
    


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2015年3月27日 5:55
    版主