C# 将数组计数相加将返回0

C# 将数组计数相加将返回0,c#,arrays,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 G

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

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,即使某些数组有数据。
我遗漏了什么吗?

@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));                
        }
    }

基本上,你错过了优先权

将其简化为一个最小的示例后,更容易看到发生了什么:

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是这里的正确答案。发生了什么事

这个??运算符的优先级低于+,因此此处的第一个运算符等效于:

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的长度


你只想申请??运算符对每个可为空的长度表达式的结果进行处理,因此括号中包含?length??0做你想做的。

我的打字错误它总是返回0请提供一个。当我们可以重现问题时,帮助您就容易多了。我怀疑这是一个优先级问题,但我现在自己复制它有困难。你如何初始化InternalTag_RelatedObjectsViewModel???你应该在??运算符,它可能会解决问题,不管实际原因,您可能会考虑以避免重复代码的方式获得总数,因此调试一般更容易,而不是在这种情况下解决实际问题。e、 g.返回新[]{BranchIDS,CompanyIDS,ContactIDS/*etc*/}.Suma=>a?长度??0;这应该没有必要。如果你能提供一个实例,我们可以帮助你找出问题所在populated@JonSkeet,似乎有必要添加括号,否则表达式将只返回第一个非空数组的长度。也许是因为?。接线员?@Sinatr:再说一遍,我的测试结果不是这样的,我们仍然没有一个接线员。@R2D2:那没用。我们不能复制、粘贴、编译、运行,也看不到它们之间的区别。你应该能够在一个很短的控制台应用程序中做到这一点。