The reason this looks weird is because your example is incorrect:
var poulation = new Tuple( "New York", 7891957, 7781984, 7894862, 7071639, 7322564, 8008278);
Are you right in thinking that it looks weird because a: Tuple is static and b: how does it know which args constructor accepts? This is because the correct line is:
var population = Tuple.Create("New York", 7891957, 7781984, 7894862, 7071639, 7322564, 8008278);
where Tuple.Create is a group of methods several generalized overloaded methods, i.e. Tuple.Create<T1>(T1 arg) , Tuple.Create<T1, T2>(T1 arg1, T2 arg2) , etc. The compiler uses type type inference to automatically select the correct 7 generic types, so your string is actually compiled as:
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);
So: it uses fairly standard language features:
- type-based type-based inference for correct overload
Create - implicit output type (
var ) based on the return type of the method