C# 为什么.NET Framework 4.0中的静态类元组可以有新的关键字来创建实例?

C# 为什么.NET Framework 4.0中的静态类元组可以有新的关键字来创建实例?,c#,oop,c#-4.0,static,tuples,C#,Oop,C# 4.0,Static,Tuples,微软在这个链接中说 无法实例化静态类。换句话说,您不能使用new关键字创建类类型的变量。因为没有实例变量,所以可以使用类名本身访问静态类的成员 我学的静态课和上面说的一样。但是对于.NET Framework 4中引入的,可以使用新关键字来创建元组 变量总体=新元组( “纽约”,7891957781984, 7894862, 7071639, 7322564, 8008278); 谁能解释一下这是怎么可能的 您讨论的是两种不同的类型:一种是静态的,您无法创建实例;另一种是通用的构造函数。是静态

微软在这个链接中说

无法实例化静态类。换句话说,您不能使用new关键字创建类类型的变量。因为没有实例变量,所以可以使用类名本身访问静态类的成员

我学的静态课和上面说的一样。但是对于.NET Framework 4中引入的,可以使用新关键字来创建元组

变量总体=新元组( “纽约”,7891957781984, 7894862, 7071639, 7322564, 8008278);


谁能解释一下这是怎么可能的

您讨论的是两种不同的类型:一种是静态的,您无法创建实例;另一种是通用的构造函数。

是静态的,无法实例化

// does not compile
var population = new Tuple("New York", 7891957, 7781984, 7894862, 7071639, 7322564, 8008278);
// compiles
var population = new Tuple<string, int, int, int, int, int, int>("New York", 7891957, 7781984, 7894862, 7071639, 7322564, 8008278);
还有另一门课,那门课。这个类不是静态的,可以实例化

// does not compile
var population = new Tuple("New York", 7891957, 7781984, 7894862, 7071639, 7322564, 8008278);
// compiles
var population = new Tuple<string, int, int, int, int, int, int>("New York", 7891957, 7781984, 7894862, 7071639, 7322564, 8008278);
//编译
变量总体=新的元组(“纽约”,7891957781984789486270716397325648008278);
静态类是一个工厂类:它的工作只是提供一种简单的方法来构造元组

实际上,.NET 4中有8个元组类:

  • 您可以创建7个通用元组的实例,最多8个通用参数:
    Tuple
    Tuple
    等等
  • 静态的
    Tuple
    factory类,它集中了上面的构造

因此,您不能创建静态类的实例,但如果几个类具有不同的泛型参数,则可以有几个具有相同名称的类。

实际上非常简单:


存在一个静态类,它是非静态元组的工厂。请注意通用参数的差异。

它看起来奇怪的原因是您的示例是错误的:

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 arg)
Tuple.Create(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);
元组填充=
Tuple.Create(“纽约”,
7891957, 7781984, 7894862, 7071639, 7322564, 8008278);
因此:它使用了相当标准的语言功能:

  • 基于参数的泛型类型推断,以解决正确的
    Create
    重载
  • 基于方法返回类型的隐式类型推断(
    var

是的,只需调用静态Tuple.Create(item1,item2);而不是使用新的符号。