为什么.NET Framework 4.0中的静态类Tuple可以有新的关键字来创建实例
本文关键字:关键字 实例 创建 Tuple Framework NET 静态类 为什么 | 更新日期: 2023-09-27 18:24:51
静态类和静态类成员
在这个链接中,微软表示,
无法实例化静态类。换句话说,不能使用new关键字来创建类类型的变量。因为没有实例变量,所以可以使用类名本身访问静态类的成员。
我学的静态课和上面说的一样。但对于.NET Framework 4中引入的静态类Tuple,可以使用新的关键字来创建一个Tuple。
var群体=新元组("纽约",7891957,7781984,78948627071639、7322564、8008278);
的另一个例子
有人能解释一下这怎么可能吗?
静态Tuple
类是一个工厂类:它的工作只是提供一种简单的方法来构造元组。
实际上,.NET4:中有8个元组类
- 7个可以创建实例的泛型元组,最多有8个泛型参数:
Tuple<T1, T2>
、Tuple<T1, T2, T3>
等等 - 静态
Tuple
工厂类,它集中了上面的构造
因此,你不能创建一个静态类的实例,但如果它们有不同的泛型参数,你可以有几个同名的类。
Tuple类是静态的,不能实例化。
// does not compile
var population = new Tuple("New York", 7891957, 7781984, 7894862, 7071639, 7322564, 8008278);
还有另一个类,Tuple<T1、T2、T3、T4、T5、T6、T7>班这个类不是静态的,可以实例化。
// compiles
var population = new Tuple<string, int, int, int, int, int, int>("New York", 7891957, 7781984, 7894862, 7071639, 7322564, 8008278);
它看起来很奇怪的原因是您的示例是错误的:
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
)
实际上很简单:
存在静态Tuple
类,它是非静态Tuple<T>
、Tuple<T1, T2>
、Tuple<T1, T2, ...>
类的工厂。注意通用参数的差异。
您谈论的是两种不同的类型,一种是静态的,不能创建实例,另一种是带有构造函数的泛型。