2017-06-13 145 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參數最後會更具可讀性。 –