我真的需要一个合理的解释。 他们为什么这样做? 为什么使用密封类型作为约束不是一种好的做法? 我需要为某些类型运行相同的函数,并且它们碰巧被密封,那有什么问题? ,有没有办法解决它?不能使用密封类型作为泛型约束
回答
密封类型不能从(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();
}
也就是说,如果arg
是Cat
,但他没有什么叫好像它是一个Car
工作正常。与Car
上的任何方法相同。通过强制使用类型派生自约束类型,您可以确保它们具有任何类型的方法,属性或变量,因此您编写的代码是类型安全的。
public void MyFunction(T arg) where T : IAnimal
{
arg.Eat(); //Guaranteed to work!
}
通过以另一种方式允许它,你有没有安全,所以它是不允许的。
,但我想使用几种类型,而不是彼此继承... – ByoTic 2014-09-02 20:43:18
@ user3050072但没有约束对于每种类型,你怎么知道他们有什么方法/属性?在这一点上,你可能会为每一个重载,因为类型系统不会让你施放。 – BradleyDotNET 2014-09-02 20:46:42
@ user3050072然后,你误解了泛型类型约束,因为即使类型没有被封闭,你也不能这样做。考虑制作一个所有类继承的接口。 – Casey 2014-09-02 20:46:58
如果类型被封闭,那么泛型参数将只能是完全一种类型。根本没有必要使用泛型。只要抛弃泛型参数,并在其他地方使用泛型参数的地方使用该类型。
泛型被设计为通用的,不适用于需要特定类型的情况。
- 1. C#泛型约束:类型不能从使用
- 2. IEnumerable中不能使用泛型类型的约束?
- 3. 用作C#中泛型方法约束的泛型类?
- 4. C#运行时将约束泛型类型转换为约束类型
- 5. 类和方法层面的泛型类型约束作用
- 6. 类型约束中的泛型
- 7. 接口的泛型类型约束?
- 8. 泛型和类型约束的规则
- 9. 类型约束的Swift泛型数组
- 10. C#泛型 - 约束的类型参数
- 11. 反映了泛型类型约束
- 12. Delphi:泛型和类型约束
- 13. Scala对可为空类型的泛型约束如何工作
- 14. C#无限泛型作为约束
- 15. 为什么你不能强制约束型开放泛型?
- 16. 指定类型约束上的通用泛型类型
- 17. 为什么实现具有类型约束的泛型接口的泛型类需要重复这些约束?
- 18. 如何为泛型提供对引用类型的约束?
- 19. 受约束的封闭类型家族
- 20. 使用属性的泛型约束
- 21. 打字稿:泛型类型基本类型约束
- 22. 泛型中的类型别名类型约束
- 23. 斯卡拉 - 约束泛型类型特定类型
- 24. 约束泛型类型参数的数值类型
- 25. C#泛型约束的泛型方法拒绝从整型转换为泛型
- 26. 具有非泛型方法约束的泛型类?
- 27. C#继承泛型类与约束
- 28. 具有度量约束的泛型类
- 29. 泛型类,约束和继承
- 30. 泛型约束与传承
您的问题是[为什么我们不能使用密封类作为泛型约束]的副本(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