Пример:
Я удалил new[]
тип new[]
который был указан перед первой фигурной скобкой, и увидел, что этот код все еще функционирует, как и ожидалось. Я попытался воспроизвести это для некоторых других интерфейсов и типов. Мне любопытно узнать, что происходит в фоновом режиме и как/почему этот синтаксис работает, но я не совсем уверен, какие ключевые слова для поиска использовать в моих поисках.
Из источника, с которым вы ICollection<string> Fields
, мы видим, что ICollection<string> Fields
инициализируется в конструкторе как List<string>
:
/// <summary>
/// Common, shared query options
/// </summary>
public CommonQueryOptions() {
Fields = new List<string>();
FilterQueries = new List<ISolrQuery>();
Facet = new FacetParameters();
ExtraParams = new Dictionary<string, string>();
}
/// <summary>
/// Fields to retrieve.
/// By default, all stored fields are returned
/// </summary>
public ICollection<string> Fields { get; set; }
Это позволяет синтаксису инициализатора функционировать должным образом, заполняя теперь инициализированный список значениями.
Что делает Fields = new[] { "*", "score" }
, так это заменяет этот список строковым массивом, содержащим эти значения. Это работает, потому что массивы также реализуют ICollection<T>
.
Пожалуйста, рассмотрите следующий пример:
public class UnitTest
{
[Fact]
public void TestList()
{
var sample = new SampleList
{
Fields = { "b", "c" }
};
var count = sample.Fields.Count;
Assert.Equal(2, count);
}
[Fact]
public void TestArray()
{
var sample = new SampleArray
{
Fields = { "b", "c" }
};
var count = sample.Fields.Count;
Assert.Equal(2, count);
}
}
public class SampleList
{
public ICollection<string> Fields { get; set; } = new List<string>
{
"a"
};
}
public class SampleArray
{
public ICollection<string> Fields { get; set; } = new string[]
{
"a"
};
}
Используемый вами синтаксис работает только в инициализаторе объектов, и он пытается добавить указанные элементы в коллекцию.
В тестовом примере TestList() assert не выполняется, потому что он добавляет "b", "c" в список и приводит к "a", "b", "c"
В тестовом примере TestArray() выполнить assert не удается, поскольку он выдает следующее исключение
System.NotSupportedException: "Коллекция была фиксированного размера."
Это означает, что если вы хотите использовать этот синтаксис инициализации объекта, вы должны использовать коллекции, которые не имеют фиксированного размера.