gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:30:05 25 4
gpt4 key购买 nike

我不知道这在 C# 中是否可行。但这是我想要做的:一个接口(interface),它声明一个带有完成 block /回调/lambda/任何你想调用它的方法。看起来很简单。但是,这是第一次尝试:

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

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

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

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

然后是 Action 和 Func。但即使是 Action 也需要一个参数,而我不需要参数。所以 Action 似乎不是一个可行的候选人。真的,我想要的是一种内联“只要签名是无效的匿名 block ”概念的方法。像这样:

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

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

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

- (void)doSomething:(void(^)(void))completionBlock

将是一个采用没有参数且没有返回类型的 block 的方法,您可以像这样调用该方法,例如:

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

最佳答案

Then there's Action and Func. But even Action takes a parameter, and I want no parameters. So Action doesn't seem like a viable candidate.

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

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

这允许你写:

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

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

yourInstance.doSomething(DoWhatever);

关于C# 如何在方法参数列表中声明 lambda 或匿名函数类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24376571/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com