C# 为什么不允许密封类是泛型类型约束?
我只是想知道为什么不允许密封类成为泛型类型约束 假设我有一个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时,我
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可能会有子类。虽然如果发生这种情况,现有代码将继续按编写的方式工作,因此这种情况不是问题。