C#泛型:什么是泛型约束接口?

4
在MSDN - C#编程指南类型参数的约束中,它说道:

where T : interface_name

类型参数必须是指定接口或实现该接口。可以指定多个接口约束。 约束接口也可以是泛型。

请问有人能够解释一下什么是泛型接口吗?并解释一下它如何成为一个约束以及提供了什么?
非常感谢您提前的帮助:)
4个回答

7

您可以使用泛型接口作为约束条件。例如:

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

你甚至可以将你定义的类型的通用参数替换为你的约束条件:
class MyClass<T> where T:IEnumerable<T>

2
这句话仅说明约束接口不仅可以是类或接口,还可以是泛型。
例如,以下约束是有效的:
public class Controller<TModel,TRepository> where TRepository: Repository<TModel>{...}

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

总的来说,它们对于特定类型的通用函数非常有用。

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集合的集合。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接