0

我正在尝试在 C# 中完成以下任务。然而,为简洁起见,我使用函数式/Haskell 风格的伪代码来表达我的观点。

想象一个exec接受任意数量参数的函数。每个参数都是一个不带参数的委托,并产生一些结果:() => T. exec执行所有提供的函数并以倍数返回它们的结果。

var results = exec(func1, func2, ..., funcN);
//results will be (res1, res2, ..., resN)

如果我想用 处理结果process,我如何确保它不会在运行时失败,因为 my 的输入类型process和结果倍数之间存在一些不匹配?

var process = results@(_, res2, ..., _) => res2;
//this must be typesafe, IFF this compiles:
var finalResult = process(results);

我怎样才能做到这一点?

一些额外的想法:
我可以想象泛型可能会有所帮助,但我不确定如何。以下面的代码为例:

var results = exec<T:ArgToResultTuple>(func1, func2, ...) // OR
var results = exec<T:ArgToResultTuple>(func[]{func1, func2, ...})

这种方法可能比普通重载更具可扩展性,因为ArgToResultTuple如果我想容纳不同数量的参数/结果,我只需要创建一个新的子类。

另一种方法是构建一个类似功能列表的结构,但这对最终用户来说很不方便:

var results = exec(func1, exec(func2, func3));
var process = results@(_, (res2, _)) => res2
//will this be typesafe?:
var finalResult = process(results);
4

0 回答 0