Причина, по которой это выглядит странно, в том, что ваш пример неверен:
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
) на основе типа возврата метода