假设我有类似的代码:
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);
答案 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
等价物。