2016-10-27 31 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#规范的问题。 –

相关问题