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:那没用。我们不能复制、粘贴、编译、运行,也看不到它们之间的区别。你应该能够在一个很短的控制台应用程序中做到这一点。