2017-06-13 73 views
-3

设为可选参数我有一些方法,如下面:前out参数

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,我认为这并不意味着不确定性的可选参数的输出参数之前。请不要指责我不读错误,我只是想确保没有办法实现它。

所以我有什么办法,使offsetstyle是没有过载可选保持参数命令

我认为结束时的out参数更具可读性。

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

你可以把它们出来后。我给你-1没有阅读错误,并没有尝试 – EpicKip

+0

我已阅读错误!我只是问为什么! out参数有一个关键字'out'!我认为这并不意味着可选参数在out参数之前出现含糊不清! –

+0

@PMExtra阅读我的答案 – Adrian

回答

2

out参数有一个关键词出来了,我觉得这样做不意味着 不明确可选参数出现在out参数之前。

这不符合你的想法。可选参数必须在最后,即使您实际上可以使用out参数避免模棱两可。但是,这不是它是如何在C#语言标准的规定,你可以在C# 5.0 Language Specification(重点煤矿)读例如:

带有默认参数的固定参数被称为可选 参数,而没有默认参数的固定参数是必需参数 。 所需的参数可能不会出现在形式参数列表中的 可选参数之后。

只有一个解决办法,那就是重新排序:

public static bool TryDoSth(byte[] data, 
          out int size, 
          int offset = 0, 
          StyleEnum style = StyleEnum.Default) 
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); 
+0

是的,这是一样的resharper建议。但我认为out参数最后更可读。 –

+0

@PMExtra你“认为”它的可读性更强,但它不是,可选参数总是最后一个,所以改变不会增加可读性 – EpicKip

+0

@EpicKip我的意思是out参数最后会更具可读性。 –