提问人:ummg 提问时间:10/10/2023 最后编辑:ummg 更新时间:10/10/2023 访问量:43
如何避免重载中重复的可选参数?
How to avoid duplicate optional arguments in overloads?
问:
在 C# 中,我有一个
void Foo(Vector<double> v, int k = 1)
{ ... }
其中 是包中的类型,表示数学列向量。从语义上讲,能够用双精度代替向量来调用此方法很有意义,这样调用者就不必在一维情况下将标量转换为一维向量。因此,我还重载了以下形式:Vector<double>
MathNet.Numerics.LinearAlgebra
void Foo(double d, int k = 1) => Foo(d.ToVector(), k);
(ToVector
是一种扩展方法。这样做的问题是必须在两个签名中添加默认值。因此,如果我想更改默认值,我必须记住在两个地方进行更改。一个可能的解决方案是用以下两个替换重载:k = 1
void Foo(double d) => Foo(d.ToVector());
void Foo(double d, int k) => Foo(d.ToVector(), k);
但是,如果我没有一个,而是 N 个可选参数怎么办?使用此解决方案,我将需要 2^N 重载。
有没有更好的方法?
答:
2赞
shingo
10/10/2023
#1
您可以将常量定义为默认值,这样,您只需要维护此常量即可。
public const int DefaultK = 1;
void Foo(Vector<double> v, int k = DefaultK)
{ ... }
void Foo(double d, int k = DefaultK)
{ ... }
评论
const int defaultK = 1;
void Foo(Vector<double> v, int k = defaultK)