如何避免重载中重复的可选参数?

How to avoid duplicate optional arguments in overloads?

提问人:ummg 提问时间:10/10/2023 最后编辑:ummg 更新时间:10/10/2023 访问量:43

问:

在 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 重载。

有没有更好的方法?

C# 重载 optional-parameters

评论

6赞 shingo 10/10/2023
你不能使用常量吗?
0赞 ummg 10/10/2023
哦,这是个好主意!我想你的意思是像然后,在重载中相似?const int defaultK = 1;void Foo(Vector<double> v, int k = defaultK)
0赞 ummg 10/10/2023
@shingo 如果您想要积分,请随时写下您的评论作为答案,我会标记为已接受。

答:

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)
{ ... }