为什么.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);

的另一个例子

有人能解释一下这怎么可能吗?

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

静态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, ...>类的工厂。注意通用参数的差异。

您谈论的是两种不同的类型,一种是静态的,不能创建实例,另一种是带有构造函数的泛型。