C# 为什么不允许密封类是泛型类型约束?

C# 为什么不允许密封类是泛型类型约束?,c#,generics,C#,Generics,我只是想知道为什么不允许密封类成为泛型类型约束 假设我有一个c语言的简单代码段,如下所示 public sealed class Base { public Base() { } } public class Derived<T> where T : Base { public Derived() { } } 公共密封类基类 { 公共基(){} } 公共类派生 其中T:Base { 公共派生(){} } 当我实例化Derivedclass时,我

我只是想知道为什么不允许密封类成为泛型类型约束

假设我有一个c语言的简单代码段,如下所示

 public sealed class Base
{
    public Base() { }
}

public class Derived<T>
        where T : Base
{
    public Derived() { }
}
公共密封类基类
{
公共基(){}
}
公共类派生
其中T:Base
{
公共派生(){}
}

当我实例化Derivedclass时,我得到的“Base”不是有效的约束。用作约束的类型必须是接口、非密封类或类型参数。

因为这样就没有泛型的意义
T
只能是
Base
,因此您最好先将其设置为非泛型类型


为什么您希望
派生的
在这里是泛型的?为什么要密封名为
Base
(意味着它应该是基类型)的类型?

因为T永远不会有子类!没有必要有这样的泛型

T
只能是
Base
。那么,让它泛型有什么意义呢?

如果只有一个类,编译器不想让它成为泛型。注意,如果密封类作为类型参数传递,则可以使用密封类作为泛型约束。例如,如果一个人有一个类

Class Foo(Of T, U As T) Foo类(属于T类,U类为T类)
可以创建该类的实例,其中两个泛型类型参数都是相同的密封类型,因为还可以创建类型参数引用不同类型的实例。

我猜他正在生成代码。代码生成器不会知道有人在类上粘贴了一个
sealed
;T已经可以转换为object,因为只有可转换为object的类型才可以用作类型参数,因此该约束将是多余的。@EricLippert,即使它没有功能上的好处。它确实有维护的好处,因为替换泛型约束类型比替换新类型中密封类的所有实例容易得多。虽然这是一个小小的好处,但我不明白为什么要强制使用非密封的泛型类型。事实上,如果以后打开它,t可能会有子类。虽然如果发生这种情况,现有代码将继续按编写的方式工作,因此这种情况不是问题。