2013-10-29 42 views
0

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

例如: 我有一个接口:

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>; 

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

例如:

SortedSet<**Class2**> expander(**Class2** currentState) 
{} 

ExpanderDelegate<Class2> expanderDel = new ExpanderDelegate(**expander**); 

当我想创建委托,我得到下面的错误。

无过载为“膨胀”匹配委托“ExpanderDelegate”

我想用这个委托与已经得到的参数全部功能。

C#可以吗?

谢谢。

+0

哇类是非常复杂的,你可以简化问题的更多信息,请。我认为你的问题与C#中的协变和逆变相关联。# –

回答

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>; 
+0

谢谢克里斯,它适用于我。 – Murat