我有以下类,其中填充了数组
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,即使某些数组有数据.我错过了什么吗?
基本上你缺少优先权.
当这被简化为一个最小的例子时,更容易看到发生了什么:
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)执行您想要的操作.