在输出参数之前制作可选参数

时间:2017-06-13 09:04:39

标签: c#

我有一些方法如下:

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参数之前是不明确的。请不要指责我不读错误,我只是想确保没有办法实现它。

那么我有什么方法可以让offsetstyle成为可选而不会重载并且保持参数顺序

我认为最后使out参数更具可读性。

int size;
TryDoSth(data, out size);
TryDoSth(data, offset, out size);
TryDoSth(data, offset, style, out size);

2 个答案:

答案 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);