使用新的字符串参数重载具有format和params args的函数

时间:2016-10-27 17:32:28

标签: c# overloading params

我有这样的功能及其过载:

  1. SomeMethod(String format, params Object[] prms)
  2. SomeMethod(String str, Exception ex, String format, params Object[] prms)
  3. 问题在于,当我使用签名的第二个变体时,我的应用程序决定通过第一个并使用“str”作为格式。我可以以某种方式避免这种情况而不改变params数组类型(在我的情况下,我没有机会这样做)?

1 个答案:

答案 0 :(得分:0)

如果参数2属于Exception类型,则首选第二次重载,因为转化Exception -> Exception优于Exception -> Object。 @MatthewWhited指出你可以传入命名参数来强制调用一个或另一个重载。

  

7.5.3.2更好的功能成员   C#4具体说明

     

为了确定更好的函数成员,构造一个精简参数列表A,它按照它们在原始参数列表中出现的顺序仅包含参数表达式本身。   每个候选功能成员的参数列表按以下方式构造:
  •如果功能成员仅适用于扩展形式,则使用扩展形式   •从参数列表中删除没有相应参数的可选参数   •重新排序参数,使它们出现在与参数列表中相应参数相同的位置   给定一个参数列表A,其中包含一组参数表达式{E1,E2,...,EN}和两个适用的函数成员MP和MQ,参数类型为{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
    }
}