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

本文关键字:泛型 约束 接口 什么 | 更新日期: 2023-09-27 17:58:52

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

其中T:interface_name

类型参数必须是或实现指定的接口。倍数接口约束可以是指定约束界面也可以是通用的

有人能解释一下,通用接口意味着什么吗?并解释一下这是如何成为一种约束以及它提供了什么?

高度赞赏CCD_ 1的示例和CCD_ 2的解释。

非常感谢:)

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

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

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

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

class MyClass<T> where T:IEnumerable<T>
通用接口的一个例子是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.集合的某个集合

一种用法是当您希望函数或类通用,但希望约束哪些类型可以与它一起使用时(例如,这样您就不必进行多个重载)。

完全任意代码示例:

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

总之,它们对于约束到特定类型的泛型函数非常有用。

这句话只说明约束接口不仅可以是类或接口,还可以是泛型接口。

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

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