我真的需要一个合乎逻辑的解释。 他们为什么这么做? 为什么使用密封类型作为约束不是一个好习惯? 我需要为某些类型运行相同的功能,它们恰好是密封的,它有什么问题? 有没有办法绕过它?
答案 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();
}
如果arg
是Cat
,那么该工作正常,但如果它是Car
则无需调用。与Car
上的任何方法相同。通过强制使用类型从约束类型派生,可以保证它们将具有该类型上的任何方法,属性或变量,因此您编写的代码是类型安全的。
public void MyFunction(T arg) where T : IAnimal
{
arg.Eat(); //Guaranteed to work!
}
通过另一种方式允许它,你没有安全感,所以不允许。
答案 1 :(得分:0)
如果类型被密封,那么泛型参数将只能是一种类型。根本没有必要使用泛型。只需废弃泛型参数,并在任何地方使用该类型,否则您将使用泛型参数。
泛型设计为通用的,不适用于需要特定类型的情况。