【问题标题】:What does Action<Action> mean?Action<Action> 是什么意思?
【发布时间】:2011-09-25 09:33:33
【问题描述】:

我刚刚在 Rx 框架上看到了一个brand-new video,一个特殊的签名引起了我的注意:

Scheduler.schedule(this IScheduler, Action<Action>)

23:55,Bart de Smet 说:

最早的版本是Action of Action

如果Action 是参数化类型,它怎么会在尖括号内再次出现未参数化?不会是Action&lt;Action&lt;Action&lt;...&gt;&gt;&gt; ad infinitum,这显然是不可能的吗?

【问题讨论】:

  • 不是也有非泛型的Action 类型吗?这可以解释它:)
  • aww,现在我觉得自己很愚蠢,我没有回答这个问题
  • 如果您真的想要一种可以烤面条的类型,请使用“delegate D D(D d);”一会儿,看看你能做什么。

标签: c# generics recursion types system.reactive


【解决方案1】:

Action&lt;T&gt; 描述了一个接受 T 类型的单个参数的委托。Action 描述了一个不接受任何参数的委托。

http://msdn.microsoft.com/en-us/library/system.action.aspx

【讨论】:

    【解决方案2】:

    Action 有几个重载。一种是非泛型的,其他的采用一、二、三等类型参数。假设它们有不同的名称,单参数版本称为Action1,零参数(非泛型)称为Action0,那么示例将是Action1&lt;Action0&gt;

    【讨论】:

    • @pst 以后编辑其他人的答案时请多加小心。你删除了我一半的文字。
    • 我没有。如果文本被删除,那是 SO 方面的并发故障(乐观并发工作/使用了吗?)。对于给您带来的不便,我深表歉意。
    • SO 对其用户所采取的谨慎态度持乐观态度。显然过于乐观了。
    • 在没有乐观保护的情况下,很难判断更改是否因为并发问题而“丢失”。如果你有问题,请把它带到meta。
    【解决方案3】:

    来自 MSDN:

    动作示例

    Action showMethod = () => { Console.WriteLine("Line"); };
    
    showMethod();
    

    动作示例

    Action<int> showMethod = (i) => { Console.WriteLine("Line {0}", i); };
    
    showMethod(1);
    

    【讨论】:

      【解决方案4】:

      Action 有一个带有签名的非泛型版本:

      public delegate void Action();
      

      所以它是一个Action,它接受一个void类型的Action。看起来很有趣,但完全有效。

      【讨论】:

      • 它是一个带有Action类型参数的Action,而不是一个返回Action的Action。一个例子是:Action doSomething = (someMethod) => someMethod();
      • dbowden,实际上您的示例将是一个 Action 而不是非泛型 Action。要将您的示例变为非通用版本,请将其更改为 Action doSomething = () => someMethod();
      • @bdowden,你是对的,我把我的话弄混了。我编辑了帖子,谢谢。
      【解决方案5】:

      默认参数似乎是这里的简单解决方案。

      【讨论】:

      • 什么...的默认参数? :(
      猜你喜欢
      • 2012-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-03
      • 2016-10-12
      • 1970-01-01
      • 2013-10-08
      • 1970-01-01
      相关资源
      最近更新 更多