gpt4 book ai didi

c# - 有没有办法转换一个函数

转载 作者:行者123 更新时间:2023-11-30 21:18:42 26 4
gpt4 key购买 nike

我认为,如果我可以只编写采用最多参数的案例,然后简单地用虚拟参数填充每个参数较少的案例,那将大大简化函数重载。例如..

// Add two integers
Func<int, int, int> addInts = (x, y) => { return x + y; };

// Add one to an integer
Func<int, int> addOne = (x) => { return x++; };

// In this case Func takes 2 args and has 1 return
public int IntCalc(Func<int,int,int> operation, int param1, int param2)
{
return operation(param1, param2);
}

// In this case Func takes 1 arg and has 1 return
public int IntCalc(Func<int, int> operation, int param1, int param2)
{
// This cast would allow me to do the overload
Func<int, int, int> castedOperation = (Func<int, int, int>)addOne;
return IntCalc(castedOperation, param1, 0);
}

那么有没有办法做到这一点?这是一种可怕的做法吗?

最佳答案

您只能在参数签名兼容的情况下进行转换。在您的情况下,您需要定义一个 lamda,因为将具有一个参数的函数转换为具有两个参数的函数通常没有任何意义。

  Func<int, int, int> castedOperation = (i1,i2)=>addOne(i1);

这是否是一个好的做法取决于如何使用委托(delegate)的契约(Contract)。如果您的参数较少的函数可以满足该契约,那么这种基于 lamda 的转换就完全没问题。

作为旁节点,您的 addOne 函数真的很丑。虽然 x 的增量没有效果,因为参数被复制,因此只有副本被递增和丢弃,将其实现为 return x+1; 会比 return x++;< 好得多 因为您实际上并不想修改 x。

关于c# - 有没有办法转换一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4090765/

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