2016-10-27 33 views
0

我有這樣的功能和它的過載:重載的功能,其具有格式而params指定參數時,用新的字符串參數

  1. SomeMethod(String format, params Object[] prms)
  2. SomeMethod(String str, Exception ex, String format, params Object[] prms)

的問題是,當我使用我的應用程序的第二個變體決定了通過第一個並使用「str」作爲格式。我可以以某種方式避免這種情況,而不改變params數組類型(在我的情況下,我沒有機會這樣做)?

+0

到底是如何你打電話了嗎?我一直無法重現。 – juharr

+0

你能告訴我你怎麼稱呼第二種方法?我試圖創建一個這樣的原型,當我調用第二個方法時,它只調用第二個方法。 – meJustAndrew

+0

@juharr是否有可能調用帶有4個參數的方法來調用它的超載而不是隻有2個參數?我不這麼認爲......不是在C# – meJustAndrew

回答

0

看來,如果參數2的類型是Exception那麼第二次過載是首選,因爲轉換Exception -> ExceptionException -> Object更好。 @MatthewWhited指出,你可以傳入命名參數來強制調用一個或另一個超載。

7.5.3.2更好功能構件 C#4 specificatipn

爲了確定更好功能部件的目的,一個精簡的參數列表A被構造在它們出現的順序只包含參數表達式本身在原始參數列表中。 每個候選函數成員的參數列表按以下方式構造:
•如果函數成員僅適用於展開形式,則使用展開形式。
•從參數列表中刪除沒有相應參數的可選參數
•參數被重新排序,以便它們出現在與參數列表中相應參數相同的位置。
給定帶有一組參數表達式{E1,E2,...,EN}的參數列表A和參數類型爲{P1,P2,...,PN}和{Q1, Q2,...,QN},MP定義爲比MQ更好的函數成員,如果
•對於每個參數,從EX到QX的隱式轉換並不比從EX到PX的隱式轉換更好,並且
•對於至少一個參數,從EX到PX的轉換優於從EX到QX的轉換。

下面的代碼調用方法#1,#1,#1,#2,#2

public class test_params 
{ 
    public void SomeMethod(String format, params Object[] prms) { Console.Write("#1: "); Console.WriteLine(format, prms); } 
    public void SomeMethod(String str, Exception ex, String format, params Object[] prms) { Console.Write("#2 "); Console.WriteLine("str={0} Excep={1}", str, ex.Message); Console.WriteLine(format, prms); } 
    public void Test() 
    { 
     SomeMethod("", 1, 2, 3);           // #1: 
     SomeMethod("{0} {1}", 1, 2);          // #1: 1 2 
     SomeMethod("{0} {1}", 1, "p2", 3, 4);        // #1: 1 p2 
     SomeMethod("{0} {1}", new Exception("Test excep"), "p2");   // #2 str={0} {1} Excep=Test excep // p2 
     SomeMethod("Str1", new Exception("Test excep"), "{0} {1}", 1, 2); // #2 str=Str1 Excep=Test excep // 1 2 
    } 
} 
+0

如果您調用'SomeMethod(「,new Exception())',它應該解析爲#1而不是#2。 –

+0

沒錯,沒有第三個參數,它不能匹配第二個過載。我對OP爲什麼會看到不同的行爲感興趣。基本的函數匹配規則早在Visual Studio .Net 2003中也是相似的。最好知道匹配意外過載的角落案例的細節。 –

+0

也許他正在使用單聲道編譯器或其他東西。他們確實知道不符合c#規範的問題。 –

相關問題