作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我认为,如果我可以只编写采用最多参数的案例,然后简单地用虚拟参数填充每个参数较少的案例,那将大大简化函数重载。例如..
// 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/
我是一名优秀的程序员,十分优秀!