2014-09-02 87 views
-3

我真的需要一个合理的解释。 他们为什么这样做? 为什么使用密封类型作为约束不是一种好的做法? 我需要为某些类型运行相同的函数,并且它们碰巧被密封,那有什么问题? ,有没有办法解决它?不能使用密封类型作为泛型约束

+0

您的问题是[为什么我们不能使用密封类作为泛型约束]的副本(http://stackoverflow.com/questions/1945085/why-cant-we-use-sealed-classes-as-generic-约束)如问。有可能你正在寻找其他东西(可能像'int Foo(MyType1 arg){...} int Foo(MyType2 arg){...} ....')重载,但是你需要澄清你的(或更好地询问单独的问题,其中明确说明你想要什么,并可以链接到这个作为解释你已经尝试过) – 2014-09-02 21:22:42

回答

2

密封类型不能从(MSDN)派生,所以使用一个作为泛型约束是没有意义的。泛型参数只能是这种类型。

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

要看看为什么你不能约束到不从约束类型继承的类型时,应考虑被允许什么:

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! 
} 

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

+0

,但我想使用几种类型,而不是彼此继承... – ByoTic 2014-09-02 20:43:18

+1

@ user3050072但没有约束对于每种类型,你怎么知道他们有什么方法/属性?在这一点上,你可能会为每一个重载,因为类型系统不会让你施放。 – BradleyDotNET 2014-09-02 20:46:42

+3

@ user3050072然后,你误解了泛型类型约束,因为即使类型没有被封闭,你也不能这样做。考虑制作一个所有类继承的接口。 – Casey 2014-09-02 20:46:58

0

如果类型被封闭,那么泛型参数将只能是完全一种类型。根本没有必要使用泛型。只要抛弃泛型参数,并在其他地方使用泛型参数的地方使用该类型。

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

+0

但是有点!我想要一个函数只为某些类型工作,具有完全相同的实现。只是一遍又一遍地重复使用同一个实现的方法没有任何意义! – ByoTic 2014-09-02 20:42:38

+0

@ user3050072:如果您认为自己有一点,请在您的问题中以(伪)代码的形式显示一个示例。这也可能有助于使你的问题独一无二,而不是重复。 – 2014-09-02 20:44:40

+2

@ user3050072将通用参数约束为密封类型不会这样做。约束条件被“与”在一起,而不是“或”。你应该使用一个接口,这就是他们的用途。 – Servy 2014-09-02 20:44:58