我有一些方法如下:
public static bool TryDoSth(byte[] data, out int size)
{
return TryDoSth(data, 0, StyleEnum.Default, out size);
}
public static bool TryDoSth(byte[] data, int offset, out int size)
{
return TryDoSth(data, offset, StyleEnum.Default, out size);
}
public static bool TryDoSth(byte[] data, StyleEnum style, out int size)
{
return TryDoSth(data, 0, style, out int size)
}
public static bool TryDoSth(byte[] data, int offset, StyleEnum style, out int size) {
// Do Sth.
}
所以我试着简化它们:
public static bool TryDoSth(byte[] data,
int offset = 0,
StyleEnum style = StyleEnum.Default,
out int size)
我收到错误,我已经阅读了它!
“可选参数必须出现在所有必需参数之后”
out参数有一个关键字out
,我认为这并不意味着可选参数出现在out参数之前是不明确的。请不要指责我不读错误,我只是想确保没有办法实现它。
那么我有什么方法可以让offset
和style
成为可选而不会重载并且保持参数顺序?
我认为最后使out参数更具可读性。
int size;
TryDoSth(data, out size);
TryDoSth(data, offset, out size);
TryDoSth(data, offset, style, out size);
答案 0 :(得分:3)
out参数有一个关键字out,我认为这并不意味着 模糊性可选参数出现在out参数之前。
这不符合您的想法。即使您实际上可以使用out
参数避免歧义,也可以选择参数。但这不是C#语言标准中指定的方式,因为您可以在C# 5.0 Language Specification(强调我的)中阅读:
带有default-argument的fixed-parameter称为可选参数 参数,而没有默认参数的固定参数是a 必需参数。 可能不会出现所需的参数 形式参数列表中的可选参数。
只有一种解决方案,那就是重新排序:
public static bool TryDoSth(byte[] data,
out int size,
int offset = 0,
StyleEnum style = StyleEnum.Default)
答案 1 :(得分:2)
您必须按如下方式声明方法:
public static bool TryDoSth(byte[] data,
out int size,
int offset = 0,
StyleEnum style = StyleEnum.Default)
以下来电是合法的:
TryDoSth(data, out size);
TryDoSth(data, out size, offset);
TryDoSth(data, out size, offset, style);
TryDoSth(data, out size, style: style);