我想创建一个通用委托。它将委托具有泛型类型的函数作为参数。
例如: 我有一个界面:
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**);
当我想创建委托时,我得到以下错误。
'expandder'没有重载匹配委托'ExpanderDelegate'
我想将此委托与所有具有派生参数的函数一起使用。
C#可以吗?
感谢。
答案 0 :(得分:1)
当然你不能。代表说:给我一个可以将任何 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>;