открытый неуниверсальный конструктор List, который нельзя использовать - PullRequest
0 голосов
/ 07 июня 2019

Когда я щелкаю правой кнопкой мыши по классу List () и нажимаю «перейти к определению», я вижу оригинальный код Microsoft со всеми членами класса. Так что в этом нет ничего нового, но первая строка -

[...]public List();

Похоже, класс List имеет открытый неуниверсальный конструктор. Это то, что эта строка говорит мне, но это неправильно, потому что вы не можете создать общий список. Так почему же эта строка кода в определении класса List? Почему он существует?

1 Ответ

0 голосов
/ 07 июня 2019

Поскольку сам тип - List<T> является универсальным, вы можете использовать универсальный аргумент T в конструкторе. Например, List<T> имеет этот конструктор:

public List (System.Collections.Generic.IEnumerable<T> collection);

Но независимо от того, какой универсальный тип используется, когда мы вызываем этот конструктор ...

var stringList = new List<string>(arrayOfStrings collection);
var intList = new List<int>(listOfInt collection);

... сам конструктор не должен быть универсальным, то есть ему не нужно иметь аргумент универсального типа. Мы указываем это при создании объекта.

Если бы нам пришлось снова включить обобщенные аргументы в конструктор, как это ...

public List<T>();
public List<T>(System.Collections.Generic.IEnumerable<T> collection);

... это не добавит никакой новой информации.

Что если бы мы создавали новый класс и поняли, что нам нужно добавить общие аргументы? У нас могут быть конструкторы, которые не имеют ничего общего с этими общими аргументами, например:

public class SomeGenericClass<T, T2>
{
    SomeGenericClass(int value)
    { /// }

    SomeGenericClass(string somethingElse)
    { /// }
}

Нам бы все равно пришлось изменить все конструкторы, что было бы бессмысленно, поскольку сами конструкторы не меняются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...