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

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/

10-12 12:47
查看更多