为什么C# static 类 可以包含non-static classes/structs?

Why can C# static classes contain non-static classes/structs?

我最近开始学习 C#,但我对某些事情感到困惑。 documentation for static classes 告诉我它们只能包含静态成员。然而,我可以在我的静态 class.

中定义非静态嵌套 classes 和结构

我猜 class/struct 定义不算作 成员 ,但为什么允许这样做?如果静态class的嵌套class可以被实例化,这不是与静态class的观点相矛盾吗?我是不是误解了一些明显的东西?

文档有点欠缺,但是static类中允许嵌套classes/structs,也可以是static,也可以实例化。考虑以下代码:

namespace StaticClasses
{
    class Program
    {
        static void Main(string[] args)
        {
            new Foo(); // Cannot create an instance of the static class 'Foo'
            new Foo.Bar(); // Cannot create an instance of the static class 'Foo.Bar'
            new Foo.Baz();
        }
    }

    static class Foo
    {
        public static class Bar
        {

        }

        public class Baz
        {

        }
    }
}

在这种情况下,静态 类 类似于命名空间,但命名空间(可能)比嵌套 类 更好地描述了语义关系。

在 C# 中嵌套的 classes 不是子 classes,周围的 class 更像是另一个命名空间。您无权从内部 class 访问外部 class 的实例(与 f.e. Java 相对)。这就是静态 classes 可以包含嵌套类型的原因。

一个著名的例子,静态的 LINQ class Enumerable。它包含许多助手 classes:

public static class Enumerable
{
    // many static LINQ extension methods...

    class WhereEnumerableIterator<TSource> : Iterator<TSource>
    {
       // ...
    }

    internal class EmptyEnumerable<TElement>
    {
        public static readonly TElement[] Instance = new TElement[0];
    }

    public class Lookup<TKey, TElement> : IEnumerable<IGrouping<TKey, TElement>>, ILookup<TKey, TElement>
    {
        // ...
    }

     // many others
}

所以周围的静态 class 是内部 class 的逻辑容器。它属于那里,因为它是从静态 class 使用的,并且通常无法从其他地方访问(如果不是 public)。

但你是对的,这是缺少文档。他们应该说:

Contains only static members or nested types