添加数组一起返回0

R2D*_*2D2 -1 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);                
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

该类由另一个类填充并通过以下方法返回

    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);
    }
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 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
    }
}
Run Code Online (Sandbox Code Playgroud)

显然3是这里正确的答案.发生什么了?

??运营商的优先级比+,所以first这里就相当于:

int first = ((a?.Length ?? (0 + b?.Length)) ?? 0;
Run Code Online (Sandbox Code Playgroud)

把它分开:

int? step1 = a?.Length;                // 2
int? step2 = step1 ?? (0 + b?.Length); // 2
int first = step2 ?? 0;
Run Code Online (Sandbox Code Playgroud)

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

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