2013-10-29 43 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