2

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

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

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

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

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

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

4

4 回答 4

2

不,委托实例不能指向开放的泛型方法。

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

于 2013-04-02T16:08:09.407 回答
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)
}

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

于 2013-04-02T16:53:22.327 回答
0

是的,这是可能的,比如FuncAction,你也可以自己制作:

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
于 2013-04-02T16:00:14.623 回答
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);
}
于 2013-04-02T16:00:51.503 回答