C# can';t使用密封类型作为泛型约束

C# can';t使用密封类型作为泛型约束,c#,generics,constraints,sealed,C#,Generics,Constraints,Sealed,我真的需要一个合乎逻辑的解释。 他们为什么这么做? 为什么使用密封类型作为约束不是一种好的做法? 我需要为某些类型运行相同的函数,而它们恰好是密封的,这有什么错? 有没有办法解决这个问题?密封类型不能从()派生,因此将其用作泛型类型约束毫无意义。泛型参数只能是该类型 您也可以在类中使用该类型而不是泛型类型参数,效果相同。因此,这项限制 查看为什么不能约束不受约束类型继承的类型,考虑您希望允许的类型: public void MyFunction(T arg) where T : Cat or C

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

密封类型不能从()派生,因此将其用作泛型类型约束毫无意义。泛型参数只能是该类型

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

查看为什么不能约束不受约束类型继承的类型,考虑您希望允许的类型:

public void MyFunction(T arg) where T : Cat or Car
{
}
我编造了一个不存在的“或”关键字,这样你就可以拥有这个功能了。现在,假设我们尝试使用
arg
变量。这是怎么一回事?它是
,还是
汽车
?假设我想写这个:

public void MyFunction(T arg) where T : Cat or Car
{
     arg.Eat();
}
如果
arg
是一个
Cat
,那么它就可以正常工作,但是如果它是一辆
Car
,就没有什么可调用的了。与
汽车上的任何方法相同。通过强制使用的类型从受约束的类型派生,可以保证它们将具有该类型上的任何方法、属性或变量,因此您编写的代码是类型安全的

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

如果以另一种方式允许它,则没有安全性,因此它是不允许的。

如果该类型是密封的,则泛型参数将只能是该类型。使用泛型没有任何意义。只需废弃泛型参数,并在任何您本可以使用泛型参数的地方使用该类型


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

但我想使用几种不相互继承的类型…@user305072但不限制每种类型,您如何知道它们有哪些方法/属性?在这一点上,您还可以为每个类型创建重载,因为类型系统不允许您强制转换。@user305072您当时误解了泛型类型约束,因为即使类型未密封,您也不能这样做。考虑创建一个接口,让所有类继承。@ USER30572编辑了“不允许”类型约束的“为什么”。约束是一起“和”的,而不是“或”。您应该使用一个接口,这正是它们的用途。@user305072您永远不会拥有一个同时是
int
long
的类型。任何类型都不能满足这些约束。@User305072:正如Servy所解释的,这意味着在您的具体案例中,
T
必须等于或继承自
int
,并且等于或继承自
double
,并且。。。看到哪里出了问题了吗?@user305072:提供了几个重载。这就是他们的目的。@user305072请查看提供的任何数学方法。几乎每种数字类型都有重载。如果它对运行时来说足够好,那么对我来说也足够好。你的问题与所问的问题是重复的。您可能正在寻找其他内容(可能是重载,如
intfoo(MyType1 arg){…}intfoo(MyType2 arg){…}……
),但您需要澄清您的帖子(或者最好单独问一个问题,清楚地说明您想要什么,并可能链接到此解释您尝试了什么)