Примере:

enter image description here

Я удалил тип new[], который был указан перед первой фигурной скобкой, и увидел, что этот код по-прежнему работает должным образом. Я пробовал воспроизвести это для некоторых других интерфейсов и типов. Мне любопытно узнать, что происходит в фоновом режиме и как / почему работает этот синтаксис, но я не совсем уверен, какие ключевые слова использовать при поиске.

2
Dinerdo 23 Окт 2018 в 20:51

2 ответа

Лучший ответ

Из источника, на который вы указали ссылку to, мы видим, что свойство 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> .

2
BoltClock 23 Окт 2018 в 18:28

Рассмотрим следующий пример:

    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: «Коллекция имела фиксированный размер».

Это означает, что если вы хотите использовать этот синтаксис инициализации объекта, вы должны использовать коллекции, которые не имеют фиксированного размера.

1
Szymon Tomczyk 23 Окт 2018 в 18:31
52955038