看來,如果參數2的類型是Exception
那麼第二次過載是首選,因爲轉換Exception -> Exception
比Exception -> 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
}
}
到底是如何你打電話了嗎?我一直無法重現。 – juharr
你能告訴我你怎麼稱呼第二種方法?我試圖創建一個這樣的原型,當我調用第二個方法時,它只調用第二個方法。 – meJustAndrew
@juharr是否有可能調用帶有4個參數的方法來調用它的超載而不是隻有2個參數?我不這麼認爲......不是在C# – meJustAndrew