C#Generics:什么是通用约束接口?

时间:2011-06-09 20:03:57

标签: c# generics

在MSDN上 - C#编程指南Constraints on Type Parameters,它说:

  

其中T:interface_name

     

类型   论证必须是或实施的   指定的接口。多   接口约束可以   指定。 约束界面   也可以是通用的。

有人可以解释一下,拥有通用界面意味着什么?并解释这可能是一个约束,它提供了什么?

非常感谢simple示例和simple解释。

非常感谢:)

4 个答案:

答案 0 :(得分:7)

您可以使用通用接口作为约束。例如:

class MyClass<T> where T:IEnumerable<string>

您甚至可以将您定义的类型的泛型参数替换为约束:

class MyClass<T> where T:IEnumerable<T>

答案 1 :(得分:2)

句子只表明约束接口不仅可以是类或接口,也可以是通用接口。

例如,这样的约束是有效的:

public class Controller<TModel,TRepository> where TRepository: Repository<TModel>{...}

答案 2 :(得分:2)

一种用法是当你想要一个函数或类一般工作但想要约束哪些类型可以使用它时(所以你不必为了多次重载)。

完全随意的代码示例:

interface IAnimal { }
interface IShape { }

class Tiger : IAnimal { }
class Wolf : IAnimal { }

class Circle : IShape { }
class Rectangle : IShape { }

public void MakeSound<T>(T animal) where T : IAnimal
{
}

public void Draw<T>(T shape) where T : IShape
{
}

这实际上并不是你要如何构建这种类型的功能:)你也可以使用其他约束:

public void someFunction<T>(T input) where T : IShape, new() // constraint to IShape, allow construction of new T with parameterless constructor

总而言之,它们对于受限于某些类型的泛型函数非常有用。

答案 3 :(得分:2)

通用接口的示例是IEnumerable<T>。它代表了您可以枚举的一些集合。集合中项目的类型与接口无关,因此它允许您使用通用参数指定。

您可以创建一个这样的类:

class Foo<T, E> where T : IEnumerable<E>
{ }

这样,通用参数T只能是类型E的集合。约束接口也是通用的。你也可以这样做:

class Foo<T> where T : IEnumerable<string>
{ }

在这种情况下,您不允许任何类型的集合,只允许字符串集合。你可以对此非常疯狂,如下:

class Foo<T> where T : IEnumerable<T>
{ }

其中T必须是包含T的集合的集合。