抽象类不能用c#封装?

now*_*ed. 6 c# oop static abstract-class .net-4.0

我在某处读到了

"抽象和密封修饰符相当于一个静态的类"

我也发现了

"当你声明一个静态类时,编译器在内部标记类抽象并密封,并在IL代码中创建一个私有构造函数"

所以,我决定这样做:

static class A
{
    public static void test()
    {
        Console.WriteLine("test");
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,类"A"不能被继承或实例化.

所以,让我们写class B使用abstract,以防止实例化和使用sealed,防止继承.

但是,这种方法失败了.

这相当于

public abstract sealed class B
{
    private B()
    {

    }
    public void test()
    {
        Console.WriteLine("test");
    }
}
Run Code Online (Sandbox Code Playgroud)

But I recieve an error stating "error CS0418:B':抽象类不能被密封或静态"`.任何想法为什么这是不可能的?

提前感谢您的回答.

Dav*_*rno 11

检查了System.Directory类的IL(它是静态的)后,它在IL中声明为:

.class public auto ansi abstract sealed beforefieldinit System.IO.Directory
extends System.Object
{
    ...
Run Code Online (Sandbox Code Playgroud)

此外,本文(http://msdn.microsoft.com/en-us/library/ms229038.aspx)建议CLR将静态类作为抽象密封类处理,以支持不支持直接删除静态类的语言(例如C++) ).

因此,总之,C#中的静态类是具有私有构造函数的密封抽象类的语法糖.我很高兴,因为"静态"更容易编写,更容易正确.