gpt4 book ai didi

c# - 如何在 C# 中为 Func<> 委托(delegate)类型创建类型同义词?

转载 作者:行者123 更新时间:2023-11-30 17:02:13 26 4
gpt4 key购买 nike

假设我有类似这样的代码:

Func<int, int, int> combineResults(Func<int, int, int> f, Func<int, int, int> g)
{
return (x, y) => f(x, y) + g(x, y);
}

我想让它更通用,更简洁,大概是通过类型同义词的方式。我知道我可以使用委托(delegate)创建类型名称:

delegate int BinaryOp(int x, int y);

或者更笼统地说:

delegate int BinaryOp<T>(T x, T y);

但是,它没有通用的返回类型。必须始终在委托(delegate)声明中指定返回类型吗?从我从规范中收集到的信息来看,似乎是这样。有没有一种方法可以在 C# 中编写类似于“类型”的内容:

type BinaryOp<T> = Func<T, T, T>
type BinaryCombinator<T> = Func<BinaryOp<T>, BinaryOp<T>, BinaryOp<T>>
BinaryCombinator<int> combineResults(f, g) { return (x, y) => f(x, y) + g(x, y) }

编辑(解决方案/ future 引用)

正如 hvr 和 Anders 所指出的,您可以在委托(delegate)声明中使用类型变量作为返回类型,因此我想要的示例可以如下编写:

delegate T BinaryOp<T>(T x, T y);
delegate BinaryOp<T> BinaryCombinator<T>(BinaryOp<T> f, BinaryOp<T> g);
static BinaryOp<int> sum = (x, y) => x + y;
static BinaryOp<int> sub = (x, y) => x - y;
static BinaryCombinator<int> combineResult = (f, g) => (x, y) => f(x, y) + g(x, y);

可以按以下方式调用:

combineResult(sum, sub)(2, 3);

最佳答案

Func<T, TResult>()只是一个标准的委托(delegate)声明,在引入泛型时添加到 C# 中,以避免必须始终声明您自己的委托(delegate)类型。 Func<T, TResult>()的声明是

public delegate TResult Func<in T, out TResult>(T arg)

您当然可以按照@hvd 建议的方式声明您自己的委托(delegate):

public delegate T BinaryOp<T>(T x, Ty);

关于c# - 如何在 C# 中为 Func<> 委托(delegate)类型创建类型同义词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20082100/

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