添加数组一起返回0

时间:2017-08-18 09:33:58

标签: c# arrays

我有以下类,其中填充了数组

public class InternalTag_RelatedObjectsViewModel
{
    public Guid[] BranchIDS { get; set; }
    public Guid[] CompanyIDS { get; set; }
    public Guid[] ContactIDS { get; set; }
    public Guid[] DivisionIDS { get; set; }
    public Guid[] TenderIDS { get; set; }
    public Guid[] ProjectIDS { get; set; }
    public Guid[] DocumentIDS { get; set; }
    public Guid[] NewsIDS { get; set; }
    public Guid[] PhotosIDS { get; set; }        

    public int Total
    {
        get
        {                               
            return (this.BranchIDS?.Count() ?? 0 + this.CompanyIDS?.Count() ?? 0 + this.ContactIDS?.Count() ?? 0 + this.DivisionIDS?.Count() ?? 0 + this.TenderIDS?.Count() ?? 0 + this.ProjectIDS?.Count() ?? 0 + this.DocumentIDS?.Count() ?? 0 + this.NewsIDS?.Count() ?? 0 + this.PhotosIDS?.Count() ?? 0);                
        }
    }
}

通过以下方法填充并返回类,在另一个类

    static void Main(string[] args)
    {
        InternalTag_RelatedObjectsViewModel test = new InternalTag_RelatedObjectsViewModel()
        {
            CompanyIDS = new Guid[] { Guid.NewGuid() },
            NewsIDS = new Guid[] { Guid.NewGuid(), Guid.NewGuid() }
        };

        Console.Write(test.Total);
    }

但Total返回0,即使某些数组有数据。 我错过了什么吗?

2 个答案:

答案 0 :(得分:5)

基本上你缺少优先权。

当这被简化为一个最小的例子时,更容易看到发生了什么:

using System;

public class Program
{
    public static void Main()
    {
        string[] a = { "x", "y" };
        string[] b = { "x" };

        int first = a?.Length ?? 0 + b?.Length ?? 0;
        int second = (a?.Length ?? 0) + (b?.Length ?? 0);
        Console.WriteLine(first);   // Prints 2
        Console.WriteLine(second);  // Prints 3
    }
}

显然3这是正确的答案。那是怎么回事?

??运算符的优先级低于+,因此first等效于:

int first = ((a?.Length ?? (0 + b?.Length)) ?? 0;

将其拆分:

int? step1 = a?.Length;                // 2
int? step2 = step1 ?? (0 + b?.Length); // 2
int first = step2 ?? 0;

请注意,因为step1的结果是非null,我们永远不会花费b的长度。

希望只对每个可空长度表达式的结果应用??运算符,因此(a?.Length ?? 0)周围的括号可以执行您想要的操作。

答案 1 :(得分:0)

@VDN发布了这个答案,然后将其删除,但它解决了我的问题。

将计算总计的方式更改为以下修复我的问题

    public int Total
    {
        get
        {                               
            return ((this.BranchIDS?.Count() ?? 0) + (this.CompanyIDS?.Count() ?? 0) + (this.ContactIDS?.Count() ?? 0) + (this.DivisionIDS?.Count() ?? 0) + (this.TenderIDS?.Count() ?? 0) + (this.ProjectIDS?.Count() ?? 0) + (this.DocumentIDS?.Count() ?? 0) + (this.NewsIDS?.Count() ?? 0) + (this.PhotosIDS?.Count() ?? 0));                
        }
    }