委派一般功能

时间:2013-04-02 15:56:48

标签: c# .net generics delegates

我可以创建一个像这样的委托吗?

// here I have delegate
delegate ... MyDel ...

MyDel del = SomeMethod; // or even lambda?
int number = del<int>(...);

作为一个想法,这可能是一个重复的问题,但我指的是这个 - &gt;

int n = del<int>(...);

那么,委托可以是通用函数吗?如果没有(我很确定它不能),为什么这样实现呢?在什么情况下会出现问题?

4 个答案:

答案 0 :(得分:2)

不,委托实例不能指向开放的通用方法。

我只能推测为什么会这样,但我认为这种语言功能的成本并没有超过它的好处,因为它可能不会经常使用。请参阅Eric Lippert关于功能如何进入C#的答案here

答案 1 :(得分:2)

代表不允许这样的功能;为此你需要定义一个接口;一些例子:

interface IActOnAnything
{
  void Invoke<T>(T it)
}
interface IActOnAnything<TP1>
{
  void Invoke<T>(T it, TP1 p1)
}
interface IActOnAnythingByRef
{
  void Invoke<T>(ref T it)
}

不幸的是,没有语言支持来促进这些接口的实现。如果一个类只需要定义一个实现接口的函数,那么可以简单地在类级别声明实现。否则,应该为每个实现声明一个嵌套的私有类,它实现接口并保存其父类型的对象。

答案 2 :(得分:0)

是的,有可能,例如 Func 行动,您也可以自己制作:

delegate TOutput MyDelegate<TInput,TOutput>(TInput input);

MyDelegate<string, int> myDelegate = input=>input.Length;

你也可以这样做:

int n = new MyDelegate<string, int>(input => input.Length)("MY STRING"); //n=9

答案 3 :(得分:0)

是的,有可能:

public delegate int Test<T>(T input) where T : struct;

public static event Test<int> TestEvent;

static void Main(string[] args)
{
    var n = TestEvent(5);
}