使用泛型接口参数创建泛型委托

本文关键字:泛型 创建 参数 泛型接口 | 更新日期: 2023-09-27 18:37:13

我想创建一个通用委托。它将委托将泛型类型作为参数的函数。

例如:我有一个界面:

public interface IProblemState<T> : IComparable<IProblemState<T>>, IEquatable<IProblemState<T>>
        where T : IEquatable<T>
{}

我有两个不同的班级

public class Class1 : IEquatable<Class1>
{ }
public class Class2 : **IProblemState<Class1>**
{ }

在我有一个代表之后

public delegate SortedSet<IProblemState<T>> ExpanderDelegate<T>(IProblemState<T> currentState) 
        where T : IEquatable<T>;

我无法使用具有派生类参数(类 2 的实例)的函数创建委托。

例如:

SortedSet<**Class2**> expander(**Class2** currentState)
{}
ExpanderDelegate<Class2> expanderDel = new ExpanderDelegate(**expander**);

当我想创建委托时,出现以下错误。

"扩展器

"没有重载与委托"扩展器委托"匹配

我想将此委托与具有派生参数的所有函数一起使用。

C#可以吗?

谢谢。

使用泛型接口参数创建泛型委托

当然不能。代表说:给我一个可以把任何IProblemState<T>作为参数的函数,你给它一个只能Class2的函数。

如果有一个Class3也实现了IProblemState<T>怎么办?当然,委托签名说我应该能够将Class3实例作为参数传入。但是该函数不允许这样做(它只允许Class2实例)。这就是为什么该函数不能分配给该委托类型的变量的原因。

您可以做的是使用此通用委托:

public delegate SortedSet<T> ExpanderDelegate<T,U>(T currentState) 
    where T : IProblemState<U> where U: IEquatable<U>;