看来,如果参数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