Почему у статического класса Tuple в .NET Framework 4.0 есть новое ключевое слово для создания экземпляров? - PullRequest
3 голосов
/ 17 февраля 2012

Статические классы и члены статических классов

В этой ссылке Microsoft говорит,

Статический класс не может быть создан. Другими словами, вы не можете использовать ключевое слово new для создания переменной типа класса. Поскольку нет переменной экземпляра, вы получаете доступ к членам статического класса, используя само имя класса.

Я выучил статический класс так же, как указано выше. Но для статического класса Tuple , представленного в .NET Framework 4, может быть добавлено новое ключевое слово для создания кортежа.

var pop = new Tuple ( «Нью-Йорк», 7891957, 7781984, 7894862, 7071639, 7322564, 8008278);

Другой пример

Может кто-нибудь объяснить, как это возможно?

Ответы [ 5 ]

5 голосов
/ 17 февраля 2012

Статический Tuple класс является фабричным классом: его задача - просто обеспечить простой способ создания кортежей.

На самом деле в .NET 4 существует 8 классов кортежей:

  • 7 Общих кортежей, в которых вы можете создавать экземпляры, используя до 8 общих аргументов: Tuple<T1, T2>, Tuple<T1, T2, T3> и т. Д.
  • Статический Tuple фабричный класс, который централизует построение вышеперечисленного.

Итак, вы не можете создать экземпляр статического класса, но у вас может быть несколько классов с одинаковыми именами, если они имеют разные общие аргументы.

4 голосов
/ 17 февраля 2012

Класс кортежа является статическим и не может быть создан.

// does not compile
var population = new Tuple("New York", 7891957, 7781984, 7894862, 7071639, 7322564, 8008278);

Есть еще один класс, Tuple Класс . Этот класс не является статичным и может быть создан.

// compiles
var population = new Tuple<string, int, int, int, int, int, int>("New York", 7891957, 7781984, 7894862, 7071639, 7322564, 8008278);
3 голосов
/ 17 февраля 2012

Причина, по которой это выглядит странно, в том, что ваш пример неверен:

var poulation = new Tuple( "New York", 7891957, 7781984, 7894862, 7071639,
     7322564, 8008278);

Вы правы, полагая, что это выглядит странно, потому что a: Tuple является статическим, а b: как он узнает, какой конструктор может принять аргумент? Это потому, что правильная строка:

var population = Tuple.Create("New York", 7891957, 7781984, 7894862, 7071639,
    7322564, 8008278);

, где Tuple.Create - это группа методов из нескольких перегруженных универсальных методов, т.е. Tuple.Create<T1>(T1 arg), Tuple.Create<T1, T2>(T1 arg1, T2 arg2) и т. Д. Компилятор использует вывод универсального типа для автоматического выбора правильных 7 универсальных типов, поэтому ваша строка на самом деле скомпилирована как:

Tuple<string,int,int,int,int,int,int> population = 
        Tuple.Create<string,int,int,int,int,int,int>("New York",
        7891957, 7781984, 7894862, 7071639, 7322564, 8008278);

Итак: он использует довольно стандартные языковые функции:

  • вывод обобщенного типа на основе параметров для разрешения правильной Create перегрузки
  • неявный вывод типа (var) на основе типа возврата метода
2 голосов
/ 17 февраля 2012

Это на самом деле довольно просто:

Существует статический Tuple класс, который является фабрикой для нестатических Tuple<T>, Tuple<T1, T2>, Tuple<T1, T2, ...> , Обратите внимание на разницу в общих параметрах.

1 голос
/ 17 февраля 2012

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

...