static class 以何种方式隐式抽象?

In what way is a static class implicitly abstract?

Jon Skeet 在他的 C# in Depth 一书中谈到了静态 class:

It can't be declared as abstract or sealed, although it's implicitly both.

抽象 class 是派生类型的基础 class。我们只能通过实例化其派生类型之一来实例化抽象 class 。另一方面,我们不能从密封的 class 中得到任何东西。一个密封的、抽象的 class 在很多意义上都是无用的。 Skeet 所说的静态 class 既抽象又密封是什么意思?他只是在说不能直接实例化吗?

它是隐式抽象的,因为您无法实例化 class。

它是隐式密封的,因为你不能从它派生。

CIL 没有静态 classes。 CIL有抽象的classes,也有sealed的classes。抽象 class 不能直接实例化(尽管具体 class 可以从抽象 class 派生)。无法派生出密封的 class。结合这些,你就有了 C# 编译器可以用来实现静态 classes.

的东西

顺便说一下,CIL 没有静态 classes 这一事实意味着 CIL 中也不存在对静态 classes 作为泛型类型参数的限制。给定一个 static class X,CIL 允许您创建 C# 调用的 List<X>。但是,鉴于不能有 X 的任何实例或任何从它派生的 class 的实例,您可以在此类列表中存储的唯一值是 null.

What does Skeet mean by a static class being both abstract and sealed?

我的意思是这就是 IL 中的表示。

例如:

static class Foo {}

生成 IL:

.class public abstract auto ansi sealed beforefieldinit Foo
       extends [mscorlib]System.Object
{
} // end of class Foo

因此,即使是不了解静态 classes 的语言也会阻止您从中派生另一个 class,并阻止您实例化它。

此外,C# 规范就是这样引用它的:

A static class may not include a sealed or abstract modifier. Note, however, that since a static class cannot be instantiated or derived from, it behaves as if it was both sealed and abstract.

这意味着它是隐式抽象的,因为 class 无法实例化 它是隐式密封的,因为您不能扩展或继承它。