C#:是否可以在同一个泛型变量上有多个通用约束?

时间:2018-02-10 13:16:17

标签: c# generics

用一个例子说明它:

    ??? public class Foo<T> where T:(ClassA || ClassB){}

是否可以在关系中限制多个无关类的T(T是ClassA或ClassB,但没有别的)或唯一的方法实现这一目标要么

  • 使ClassA和ClassB都实现相同的接口
  • 让这两个类派生自相同的基类

并将它们用作约束?

所以,为了说清楚:我的问题不关心你是否可以 n n n 变量数量的通用约束,我想知道我是否对于同一个变量,可以有 n 个约束条件。

4 个答案:

答案 0 :(得分:3)

  

我会为两者实现不同类型的逻辑并返回相应的逻辑。当然,这可以使用接口来完成。

即使您可以保证两种类型都具有完全相同的成员,编译器也无法验证这一点。

通过让两个类实现相同的接口,您可以向编译器保证它们至少共享接口的成员,并且这些成员可供通用类使用。这就是接口存在的原因以及泛型的全部要点。

答案 1 :(得分:2)

不,如果你考虑一下,它就不会非常有用。

应用泛型约束的目的是确保代码能够对类型执行某些操作。例如。 new()约束确保您可以执行new T(),这对于无约束类型是不可能的。但是应用&#34;或&#34;约束不为T提供任何有用的静态保证,因此您无法将其用于任何事情。

可以对单个类型变量有多个约束,但它们是&#34;和&#34;约束,即它们都必须得到满足。

答案 2 :(得分:1)

如果我做对了,你基本上想要将表达式作为约束的一部分进行评估,据我所知,它是不可能的。

类型参数可以有多个约束,但不是表达式。请参阅this example

class EmployeeList<T> where T : Employee, IEmployee, System.IComparable<T>, new()
{
    // ...
}

这里T肯定有多个约束,但不是表达式。

在这种情况下,您可能希望看一下您的设计,以消除您的问题。

答案 3 :(得分:0)

简短回答是:,你不能。其他人已经解释了原因,但总之,你会失去仿制药带来的类型安全性。

如果由于某种原因你仍然需要这个,有一个解决方案来使用方法重载,编译器完成剩下的工作。

public void Foo<T>(T instance) where T : ClassA
{
   GenericFoo(instance);
}

public void Foo<T>(T instance) where T : ClassB
{
    GenericFoo(instance);
}

private void GenericFoo(object instance)
{
  // Do stuff
}