2011-04-26 36 views
1

我正在使用一些帶有命名參數和可選參數的方法來替換一系列方法重載。可選參數,與方法簽名中的Out混合使用

雖然這不會造成問題,但我發現使用'out'時在工作中有扳手。

例如

,如果我打電話:

foo(int a, out int b, int c = -1, string d = "") 

編譯器將拋出一個錯誤,因爲任何時候我把這種方法,它沒有看到或承認其作爲該方法的相關簽名。

我意識到任何可選的參數都必須在強制的後面出現 - >是否有任何這樣的參數與'出'的規則,或者我什麼都不明顯?

+0

什麼版本的Visual Studio(或框架),您使用的是?這些功能只在2010年加入。 – Nick 2011-04-26 09:36:22

+0

'foo(int a,out int b,int c = -1,string d =「」) '看起來對我來說不是一個有效的方法定義,它肯定不是有效的調用。你如何向我們展示你的真實代碼?...編輯:啊,這是新的.NET4/VS2010語法。我還沒有享受過......地獄我們仍然從1.1升級到2.0 ;-) – corlettk 2011-04-26 09:41:08

+0

@corlettk - >正確 @Nick vs 2010/.net4 – templater 2011-04-26 10:34:35

回答

3

如果你的意思調用定義爲每例的方法,然後就(例如):

int x; 
foo(123, out x, d: "hi"); 

out參數不能是可選的(這意味着它可選填之前必須出現) ,但可以指定任何地方(如命名參數) - 例如:

int x; 
foo(b: out x, a: 123); 

如果你想b是可選的,那麼你需要一個過載:

void foo(int a, int c = -1, string d = "") 
{ 
    int b; 
    foo(a, out b, c, d); 
} 

現在,您可以撥打:

foo(123, d: "hi"); 
+0

我的外觀與您的格式相同嗎?然而,我發現如果我有兩種方法(一種是另一種的超載),例如 FOO(INT一個,OUT INT B,INT C = -1,串d = 「」) 和 FOO(INT一個,OUT INT B,INT C) 然後如果我嘗試調用的方法帶有可選參數,例如: int x = foo(4,5); 編譯器會拋出一個錯誤,並指向重載(沒有可選參數的那個),並告訴我我錯過了c .... – templater 2011-04-26 10:04:45

+0

@templater foo(4,5)在這裏工作正常;如果你有一個特定的對不起作用,發佈它們... – 2011-04-26 10:13:59

+0

我遇到的具體對組合是: int DoSomethingReturnValue(異常a,輸出字符串b,int c = -1, int d = 1,int e = -1,object [] f = null,string g =「」)int DoSomethingReturnValue(異常a,int c,int d,int e,out字符串b)。任何時候我會打電話說,int returnedValue = DoSomethingReturnValue(ex,out desc); - 編譯器會忽略帶有可選參數的版本,並告訴我DoSomethingReturnValue沒有超過2個參數的重載,指向超載沒有可選的參數.... – templater 2011-04-26 10:33:25