繁体   English   中英

具有新的字符串参数的具有格式和参数args的重载函数

[英]Overloading functions, which have format and params args, with new string argument

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

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

问题是,当我使用签名的第二个变体时,我的应用程序决定通过第一个变体并使用“ str”作为格式。 我能以某种方式避免这种情况而不更改params数组类型吗(在我的情况下,我没有机会这样做)?

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

7.5.3.2更好的功能成员C#4规范

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM