c#如何在方法参数列表中声明lambda或匿名函数类型

本文关键字:lambda 类型 函数 声明 方法 列表 参数 | 更新日期: 2023-09-27 18:10:04

我不知道这在c#中是否可能。但我想做的是:一个用补全块/回调/lambda/任何你想调用的方法声明方法的接口。看起来很简单。但是,这里是第一次尝试:

namespace N {
  interface MyInterface {
    delegate void CompletionBlock();
    void doSomething(CompletionBlock completionBlock);
  }
}

但是接口不能声明委托。好的,这个怎么样?

namespace N {
  public delegate void CompletionBlock();
  interface MyInterface {
    void doSomething(CompletionBlock completionBlock);
  }
}

当然可以,但是现在,假设我声明了另一种类型的CompletionBlock,例如,它接受一个参数。我不能调用CompletionBlock类型,因为如果在相同的命名空间中,它将与上述类型冲突。

还有Action和Func。但即使是Action也需要参数,而我不想要参数。所以Action似乎不是个可行的选择。实际上,我想要的是一种内联"匿名块"概念的方法,只要签名是空的(void)。像这样:

namespace N {
  interface MyInterface {
    void doSomething(typeof(()=>) completionBlock);
  }
}

但是lambda在c#中并没有真正的类型。至少他们有签名吧?基本上,有什么办法可以解决这个问题吗?

例如,在Objective-C中,block的类型是NSBlock,尽管它们的签名本身不容易访问,但是可以创建一个方法来获取带有特定签名的block。例如:
- (void)doSomething:(void(^)(void))completionBlock

将是一个接受一个没有参数和返回类型的块的方法,您可以这样调用该方法,例如:

[obj doSomething:^(){your block code}];

c#如何在方法参数列表中声明lambda或匿名函数类型

还有Action和Func。但即使是Action也需要参数,而我不想要参数。所以Action似乎不是可行的选择。

如果您使用Action(而不是Action<T>),则它不接受参数。

namespace N {
  interface MyInterface {
    void doSomething(Action completionBlock);
  }  
}

你可以这样写:

yourInstance.doSomething(() => DoWhatever(foo));

或者,如果DoWhatevervoid DoWhatever(),只需:

yourInstance.doSomething(DoWhatever);

使用Action<T>Func<TResult>或其兄弟姐妹之一,或者在您的情况下仅使用Action

Action<...>不返回任何与Func<..., TResult>相同的东西