【问题标题】:C# generic delegate that accept function without arguments接受不带参数的函数的 C# 泛型委托
【发布时间】:2015-02-02 21:41:36
【问题描述】:

我创建了一个通用委托,我想为它分配一个不带任何参数的函数。 有可能吗?

这是我目前尝试过的:

class Program
    {
        public delegate void TemplateDel<T>(T item);

        public static void fWriteLetters(char[] p_cLetters)
        {
            for (int i = 0; i < p_cLetters.Length; i++)
                Console.WriteLine(p_cLetters[i]);
        }
        void fNoArg()
        {
            Console.WriteLine("No arguments!");
        }
        static void Main(string[] args)
        {
            TemplateDel<char[]> l_dWriteLeters  = new TemplateDel<char[]>(fWriteLetters);
            TemplateDel<void> l_dNoArg              = new TemplateDel<void>(fWriteLetters);


        }
    }

最后一行代码没有编译...

【问题讨论】:

  • “不编译”意味着一条错误消息——它是什么?另外,最后一行不应该是new TemplateDel&lt;void&gt;(fNoArg)而不是fwriteLetters吗?
  • 作为一个风格点:不要为此定义你自己的委托类型。使用框架中的 FuncAction 委托之一,它们已经存在最多 16 个参数。如果使用事件处理程序 - 采用 (object, EventArgs) 对 - 然后使用 EventHandler。由于这些都是您的代码的知名读者,因此您会更好地了解您在做什么。
  • void in C# generics?的可能重复

标签: c# generics


【解决方案1】:

不,这是不可能的。void 仅在返回类型中有效。您不能将其用作其他上下文中的类型。 (unsafe 上下文除外)

您需要为您的委托添加另一个重载。

public delegate void TemplateDel();

或者干脆使用Action

【讨论】:

    【解决方案2】:

    正如Selman22 在其他answer 中的注释:

    不,这是不可能的。

    但是还有另一种方法,使用 lambda 来丢弃参数:

    TemplateDel<bool> l_dNoArg = new TemplateDel<bool>(_ => fWriteLetters);
    

    (这里使用_作为标识符匹配F#的通配符——忽略这个参数——语法。)

    虽然在这里没有帮助,但这种包装器在传递不感兴趣的参数时很有帮助,并且无需编写额外的成员来忽略或重新排列参数。

    【讨论】:

    • 不行……不编译:“只有赋值、调用、递增、递减、等待、新对象表达式可以作为语句使用” *我搞错了最后一行应该是 fNoArg。
    • @AmitLipman 这个错误——只有某些事情作为陈述是有效的——只能在上下文中解决。但是有一个可能相关的错字。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多