Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用约束';代表';_C# - Fatal编程技术网

C# 如何使用约束';代表';

C# 如何使用约束';代表';,c#,C#,C现在允许泛型中的委托约束。当我试图学习新功能时,我没有一个实用的方法来使用它。由于其他人多年来一直要求使用此功能,我显然没有抓住要点 public class Test<TDelegate> where TDelegate : Delegate { readonly TDelegate fd; // no way to call this public event TD Evt; // not even legal } 公共类测试,其中TDelegate:Del

C现在允许泛型中的委托约束。当我试图学习新功能时,我没有一个实用的方法来使用它。由于其他人多年来一直要求使用此功能,我显然没有抓住要点

public class Test<TDelegate> where TDelegate : Delegate
{
    readonly TDelegate fd; // no way to call this 
    public event TD Evt; // not even legal
}
公共类测试,其中TDelegate:Delegate
{
只读TDelegate fd;//无法调用此
公共事件TD Evt;//甚至不合法
}

类如何使用作为委托的泛型参数执行有用的操作?

您需要做的就是:

public static void Foo<T>(T t) where T : System.Delegate
{
    t.DynamicInvoke();
}
publicstaticvoidfoo(T)其中T:System.Delegate
{
t、 DynamicInvoke();
}

出于某种原因,普通的
Invoke()
不是一个可以使用的有效方法

使用委托最明显的方法是
。调用它。(而
event
也只是围绕其他操作的语法糖衣,比如
.Combine
),为了它的价值。@DavidG:问题是现在该怎么做,在最新版本的C#中,您可以将类型约束到委托。事实上,它被描述了,还有使用的演示。这就把问题变成了“你能给我解释一下这些文档吗?”@Jeroemostert呃,是的,我应该正确地阅读这个问题!“出于某种原因”。我就是这么说的,是的。@AustinWBryan Ed Plunkett讽刺可能是因为有一个非常具体的原因:
Invoke
是强类型的,并且具有委托的确切参数数(以及确切的返回类型)。显然,这是基于委托
T
(在编译时未知)而改变的
DynamicInvoke
对委托一无所知,并且是完全通用的(它作为参数有一个
object[]
,作为返回类型有一个
object
),实际上,您需要做的就是查看它没有
Invoke
方法。