我可以创建一个像这样的委托吗?
// here I have delegate
delegate ... MyDel ...
MyDel del = SomeMethod; // or even lambda?
int number = del<int>(...);
作为一个想法,这可能是一个重复的问题,但我指的是这个 - &gt;
int n = del<int>(...);
那么,委托可以是通用函数吗?如果没有(我很确定它不能),为什么这样实现呢?在什么情况下会出现问题?
答案 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);
}