C# 您是否可以使用';代表';但两者都不行';行动';或';Func';?

C# 您是否可以使用';代表';但两者都不行';行动';或';Func';?,c#,delegates,C#,Delegates,提前为这个菜鸟问题道歉(因为我是C#中的一员): 在研究代理时,我认为操作和函数的组合涵盖了代理关键字的整个“功能” 换句话说,您不能使用delegate关键字,但不能使用Action或Func 我尝试了以下示例(效果很好): Func-Func=(x,y,z)=>(x您可以创建接受ref或out参数的委托。您不能定义具有ref或out参数的Func或操作 例如: delegate void MyDelegate(ref string val); 不能表示为操作如果您想要: 您的方法有16个以

提前为这个菜鸟问题道歉(因为我是C#中的一员):

在研究代理时,我认为
操作
函数
的组合涵盖了
代理
关键字的整个“功能”

换句话说,您不能使用
delegate
关键字,但不能使用
Action
Func

我尝试了以下示例(效果很好):


Func-Func=(x,y,z)=>(x您可以创建接受
ref
out
参数的委托。您不能定义具有
ref
out
参数的
Func
操作

例如:

delegate void MyDelegate(ref string val);

不能表示为
操作

如果您想要:

  • 您的方法有16个以上的参数

  • 任何参数都可以是
    ref
    out
    参数

  • 一个
    params
    参数

  • 任何参数的可选参数

  • 对任何泛型参数的约束。(确保参数是扩展类型的任何类型、具有无参数构造函数、是值/引用类型等)

  • 不安全
    方法签名中使用的类型,例如作为参数的指针

  • 有一个非逆变的参数,或一个非协变的返回类型。
    Func
    Action
    都尽可能地应用方差,因此,如果您的委托不可变很重要,您需要自己的变量


  • 我的两分钱:对于您自己的一般委托,您可以申请
    Func
    操作

    delegate void MyDelegate<T>(T input) where T : struct;
    
    delegate void MyDelegate(T输入),其中T:struct;
    

    编译器将确保
    MyDelegate
    始终具有
    T
    等值类型,不允许使用引用类型。

    我将定义操作和函数包装器/帮助器类,使程序易于使用,并使委托标准化。请看一下Thank@Tarec。我希望我的问题与之前的某篇文章重复,但是还没有找到答案。你的链接提供了我问题的部分答案,但它解释了一些我已经知道的事情。所以基本上我只是想弄清楚一旦你有了
    Action
    Func
    它是否“涵盖了整个事情”,还是我遗漏了什么?再次感谢。@barakmanos你是对的,这个答案并不能解释两者在使用目的上的区别。请检查这个解释,我希望它能有所帮助;)
    out
    params
    和可选参数实际上是
    Action
    /
    Func
    :指定自定义属性的能力的一个常见且更一般的不可能性的三个结果。您可以添加
    不安全类型的情况,即某些参数或返回值为指针类型的委托类型。例如
    公共不安全委托字符串GetString(char*value)。如果您不希望将类型参数标记为协变或逆变,请再次使用。请注意,
    TEventArgs
    中的
    System.EventHandler
    不是逆变的(而不是“
    中的”
    ”),因为它可能导致多播委托出现问题。因此,在这方面,它与
    行动
    不同。@JeppeStigNielsen补充道。谢谢
    
    delegate void MyDelegate<T>(T input) where T : struct;