我有以下类,其中填充了数组
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,即使某些数组有数据。 我错过了什么吗?
答案 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));
}
}