C# 为什么.NET Framework 4.0中的静态类元组可以有新的关键字来创建实例?
微软在这个链接中说 无法实例化静态类。换句话说,您不能使用new关键字创建类类型的变量。因为没有实例变量,所以可以使用类名本身访问静态类的成员 我学的静态课和上面说的一样。但是对于.NET Framework 4中引入的,可以使用新关键字来创建元组 变量总体=新元组( “纽约”,7891957781984, 7894862, 7071639, 7322564, 8008278);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); 谁能解释一下这是怎么可能的 您讨论的是两种不同的类型:一种是静态的,您无法创建实例;另一种是通用的构造函数。是静态
谁能解释一下这是怎么可能的 您讨论的是两种不同的类型:一种是静态的,您无法创建实例;另一种是通用的构造函数。是静态的,无法实例化
// 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
- 静态的
factory类,它集中了上面的构造Tuple
因此,您不能创建静态类的实例,但如果几个类具有不同的泛型参数,则可以有几个具有相同名称的类。实际上非常简单:
存在一个静态类,它是非静态元组的工厂。请注意通用参数的差异。它看起来奇怪的原因是您的示例是错误的:
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