我认为如果我可以编写占用大多数参数的情况,然后简单地用虚拟参数填充每个具有较少参数的情况,那么它将极大地简化函数重载。例如..
// 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);
}
有没有办法做到这一点?这是一种可怕的做法吗?
答案 0 :(得分:2)
您只能在参数签名兼容时进行投射。在你的情况下,你需要定义一个lamda,因为将具有一个参数的函数转换为具有两个参数的函数通常是没有意义的。
Func<int, int, int> castedOperation = (i1,i2)=>addOne(i1);
如果这是一个好的做法取决于如何使用代表的合同。如果参数较少的函数可以满足该合约,则基于lamda的转换完全正常。
作为sidenode,你的addOne函数真的丑陋。虽然x的增量没有效果,因为参数被复制,因此只有副本被递增和丢弃,实现它return x+1;
将比return x++;
好得多,因为你实际上并不想修改X
答案 1 :(得分:1)
除了已接受的答案,您还应将addOne更改为操作。所以完整的功能将是
// 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 = (i1,i2)=>operation(i1);
return IntCalc(castedOperation, param1, 0);
}
答案 2 :(得分:1)
如果您的所有参数都是同一类型,则可以使用params
adder(bool sample, params int[] a)
{
....
}
adder(2,3,4);
您也可以在C#4.0中使用Named Parameter。
您的方法在构造函数中很有用(您可以使用它们执行此操作)。