不能使用密封类型作为泛型约束

时间:2014-09-02 20:35:57

标签: c# generics constraints sealed

我真的需要一个合乎逻辑的解释。 他们为什么这么做? 为什么使用密封类型作为约束不是一个好习惯? 我需要为某些类型运行相同的功能,它们恰好是密封的,它有什么问题? 有没有办法绕过它?

2 个答案:

答案 0 :(得分:2)

密封类型不能从(MSDN)派生,因此使用one作为泛型类型约束是没有意义的。泛型参数只能是那种类型。

您也可以在类中使用该类型而不是泛型类型参数,效果将是相同的。因此,限制。

要了解为什么不能约束不从约束类型继承的类型,请考虑允许想要的内容:

public void MyFunction(T arg) where T : Cat or Car
{
}

我编写了不存在的“或”关键字,以便您可以使用该功能。现在,我们假设我们尝试使用arg变量。它是什么?是Cat还是Car?说我想写这个:

public void MyFunction(T arg) where T : Cat or Car
{
     arg.Eat();
}

如果argCat,那么该工作正常,但如果它是Car则无需调用。与Car上的任何方法相同。通过强制使用类型从约束类型派生,可以保证它们将具有该类型上的任何方法,属性或变量,因此您编写的代码是类型安全的。

public void MyFunction(T arg) where T : IAnimal
{
    arg.Eat(); //Guaranteed to work!
}

通过另一种方式允许它,你没有安全感,所以不允许。

答案 1 :(得分:0)

如果类型被密封,那么泛型参数将只能是一种类型。根本没有必要使用泛型。只需废弃泛型参数,并在任何地方使用该类型,否则您将使用泛型参数。

泛型设计为通用的,不适用于需要特定类型的情况。