【问题标题】:How to declare a generic delegate with an out parameter [duplicate]如何使用输出参数声明通用委托[重复]
【发布时间】:2025-12-13 04:25:01
【问题描述】:

Func<a, out b, bool>,不编译,如何声明第二个参数是out

我想这样使用它:

 public class Foo()
 {
     public Func<a, out b, bool> DetectMethod;
 }

【问题讨论】:

    标签: c# .net generics func out


    【解决方案1】:

    实际上,Func 只是在 .NET Framework 中声明的一个简单委托。实际上,那里声明了几个 Func 代表:

    delegate TResult Func<TResult>()
    delegate TResult Func<T, TResult>(T obj)
    delegate TResult Func<T1, T2, TResult>(T1 obj1, T2 obj2)
    delegate TResult Func<T1, T2, T3, TResult>(T1 obj1, T2 obj2, T3 obj3)
    delegate TResult Func<T1, T2, T3, T4, TResult>(T1 obj1, T2 obj2, T3 obj3, T4 obj4)
    delegate TResult Func<T1, T2, ... , T16, TResult>(T1 obj1, T2 obj2, ..., T16 obj16)
    

    所以你唯一能做的就是声明你的自定义委托:

    delegate bool MyFunc<T1, T2>(T1 a, out T2 b)
    

    【讨论】:

      【解决方案2】:

      您需要创建自己的委托类型,如下所示:

      delegate bool MyFunc(Type1 a, out Type2 b);
      

      【讨论】:

      • 是的。泛型 Func 委托是采用常规类型参数的常规泛型类型。 out b 不是类型。
      【解决方案3】:

      您可能需要重新考虑您的设计。您真的需要通过添加 out 参数来使代码复杂化吗?

      您可以将 bool 返回类型和第二个输出类型包装在它们自己的类(或 .NET 4.0 元组)中并将其用作返回类型:

      public Func<Type1, Tuple<Type2, bool>> DetectMethod;
      

      当然,当您想使用委托来引用 try-parse 方法时,您是在正确的轨道上,您需要像其他人已经描述的那样定义一个新的委托。

      【讨论】:

      • 这也比带有 ref 或 out 参数的自定义委托对 LINQ 更友好。