我可以创建一个这样的委托吗?
// here I have delegate
delegate ... MyDel ...
MyDel del = SomeMethod; // or even lambda?
int number = del<int>(...);
作为一个想法,这可能是一个重复的问题,但我指的是这个->
int n = del<int>(...);
那么,委托可以是通用函数吗?如果不是(我很确定它不能),为什么要这样实现?在什么情况下会出现问题?
不,委托实例不能指向开放的泛型方法。
我只能推测为什么会这样,但我认为这种语言功能的成本不会超过它的好处,因为它可能不会经常使用。请参阅 Eric Lippert 的回答,了解功能如何进入 C#。
代表不允许此类功能;为此,您需要定义一个接口;一些例子:
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)
}
不幸的是,没有语言支持来促进此类接口的实现。如果一个类只需要定义一个实现接口的函数,则可以简单地在类级别声明实现。否则,可能应该为每个实现声明一个嵌套的私有类,该类实现接口并保存其父类型的对象。
是的,这是可能的,比如Func,Action,你也可以自己制作:
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
是的,有可能:
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);
}