c# – 为什么集合初始值设定项不与表达式body属性一起使用?
作者:互联网
我认为现在最好显示代码:
class Foo
{
public ICollection<int> Ints1 { get; } = new List<int>();
public ICollection<int> Ints2 => new List<int>();
}
class Program
{
private static void Main(string[] args)
{
var foo = new Foo
{
Ints1 = { 1, 2, 3 },
Ints2 = { 4, 5, 6 }
};
foreach (var i in foo.Ints1)
Console.WriteLine(i);
foreach (var i in foo.Ints2)
Console.WriteLine(i);
}
}
显然,Main方法应该打印1,2,3,4,5,6,但它只打印1,2,3.初始化后foo.Ints2.Count等于零.为什么?
解决方法:
这是因为您已经定义了Int2属性.虽然它确实是一个吸气剂,但它总是会返回一个新列表. Int1是一个只读的自动属性,所以它总是返回相同的列表.下面为类Foo删除了等效的编译器魔术代码:
class Foo
{
private readonly ICollection<int> ints1 = new List<int>();
public ICollection<int> Ints1 { get { return this.ints1; } }
public ICollection<int> Ints2 { get { return new List<int>(); } }
}
正如您所看到的,Ints2的所有变异都会丢失,因为列表总是新的.