如何在参数为null时区分重载

时间:2013-06-14 11:19:12

标签: c#

这似乎是我之前应该考虑的事情,但事实并非如此。似乎应该有一种现有的方法来做到这一点。

问题:假设我有一个带有几个构造函数的类

public class ModuleAction
{
    public ModuleAction(string url, string caption)
    { ... }

    public ModuleAction(string url, ModuleAction action)
    { ... }
}

然后在其他地方,我调用其中一个构造函数,但第二个参数为null,它不知道使用哪个构造函数

ModuleAction action = new ModuleAction("http://google.co.uk", null);

有没有办法做到这一点?我目前的解决方案是向其中一个构造函数添加一个未使用的参数,但这似乎不正确。

我的解决方案:(不太漂亮)

public class ModuleAction
{
    public ModuleAction(string url, string caption, bool unused)
    { ... }

    public ModuleAction(string url, ModuleAction action)
    { ... }
}

6 个答案:

答案 0 :(得分:12)

这里有几种选择。

简单直接的解决方案是将null转换为您希望使用的重载中的参数类型:

ModuleAction action = new ModuleAction("http://google.co.uk", (string)null);

更好的选择是使用具有单个参数的新构造函数并使用默认值对其进行链接:

public ModuleAction(string url) : this(url, "")

答案 1 :(得分:6)

您可以将null转换为预期的参数类型。

new ModuleAction(url, (string) null);

new ModuleAction(url, (ModuleAction) null);

答案 2 :(得分:4)

您可以使用强制转换:

new ModuleAction("http://google.co.uk", (ModuleAction)null);

答案 3 :(得分:3)

您有三种选择:

  1. 您可以将null转换为合适的类型。
  2. 您可以提供一个构造函数,该构造函数只接受一个参数并使用它而不是传递null。
  3. 您可以使用命名参数。

答案 4 :(得分:2)

创建一个没有第二个参数的构造函数。

public ModuleAction(string url) 
{ ... }

然后很清楚,如果不能提供第二个参数,将使用哪一个。

答案 5 :(得分:2)

怎么样

new ModuleAction("uu", (string)null);
new ModuleAction("uu", (ModuleAction)null);