如何为Func<>创建类型同义词?委托C#中的类型?

时间:2013-11-19 21:10:20

标签: c# generics delegates

假设我有类似的代码:

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 int BinaryOp(int x, int y);

或者更一般地说:

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

但是,这没有通用的返回类型。您是否必须始终在委托声明中指定返回类型?从我从规范中收集到的内容看起来如此。 有没有办法在C#中写出类似“type”的东西:

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) }

编辑(解决方案/未来参考)

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

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);

2 个答案:

答案 0 :(得分:2)

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

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

您当然可以像@hvd建议的那样声明自己的委托:

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

答案 1 :(得分:0)

  

必须始终在委托声明中指定返回类型

完全没有 - 你根本不需要返回类型 - 请看EventHandler<T>

public delegate void EventHandler<TEventArgs>(
    Object sender,
    TEventArgs e
)
  

有没有办法写类似&#34;类型&#34;在C#

如果你正在寻找的话,那就没有typedef等价物。