【问题标题】:C# Method overloading is calling the wrong method when using string args [duplicate]C#方法重载在使用字符串参数时调用错误的方法[重复]
【发布时间】:2017-01-31 05:51:32
【问题描述】:

我正在尝试为自己制作一个日志插件,我希望有一个方法可以用不同的参数对其进行重载。
关键是,它需要可以添加多个字符串,我将在不同的行上打印。我喜欢使用params 的想法,这样我就不需要每次都添加string[] { strings here }

我目前遇到的问题是Log.L()方法不会触发第一种,而是第二种方法,这有点道理。

我怎样才能解决这个问题,同时保留params

Log.L("line1", "line2", "line3");

public static class Log
{
   public static void L(params string[] message)
   {
       Write(LogType.Log, message);
   }   

   public static void L(string location, params string[] message)
   {
       Write(LogType.Log, message, false, location);
   }
}

【问题讨论】:

  • 只是不同的方法命名。没有人说你必须使用方法重载;主要是为了方便。
  • 我同意,但是重载看起来好多了。在应用这个之前,我想看看其他解决方案弹出^^
  • 顺便说一句...L 无论如何都不是一个很好的方法名称。更具描述性的东西会更好。
  • 嗯,我从 Android Studio 得到了这个想法。他们使用 L 进行日志记录,使用 D 进行调试等。不过我喜欢这个想法。它所需要的只是一些好的文档,对吧? :D
  • Rory 的建议是正确的。没有办法强制编译器使用其他方法。它将始终选择“public static void L(string location, params string[] message)”,因为它是最具体的。所以,你需要消除歧义。您可以使用不同的类型(例如,位置真的是枚举吗?路径?),不同的方法名称,或者只保留一个方法。但老实说,我不明白为什么 params 在这里有用。 StringBuilder 易于使用,轻量级,并且很清楚发生了什么。

标签: c# overloading args


【解决方案1】:

它总是假设第一个字符串是location 所以,只需使用第二个重载:

public static void L(string location, params string[] message)
   {
       Write(LogType.Log, message, false, location);
   }

当位置不可用时,您可以简单地传递 null 或空字符串并在方法中处理它。

【讨论】:

    【解决方案2】:

    您可以创建两个类并使用它们来区分两个重载。如果你愿意,你甚至可以让一个类继承另一个类。

    public class LoginWithMessages {
        public string[] Messages {get; set;}
    }
    
    public class LoginWithLocation : LoginWithMessages {
        public string Location {get; set;}
    }
    

    那么你的方法签名将是:

    public static void L(LoginWithMessages loginMessage)
    
    public static void L(LoginWithLocation loginLocation)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-15
      • 1970-01-01
      • 2013-02-08
      • 2014-10-25
      • 2013-04-25
      • 2015-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多