不带可选参数的模糊方法调用

时间:2017-11-02 13:50:02

标签: c#

我有一个包含两个构造函数的类:

public class Foo
{
    public Foo(string bar = "hello"){
    }

    public Foo(string bar = "hello", string barrier = "world"){
    }
}

现在,当我想用​​1个参数调用构造函数时,我可以调用:

new Foo();

但是我得到了一个模糊的引用错误,因为Visual Studio不知道我想要使用哪个构造函数。如何在不传递参数的情况下指定我想要的构造函数?

5 个答案:

答案 0 :(得分:4)

默认值的目的是减少方法的数量,只需要

public class Foo
{
    public Foo(string bar = "hello", string barrier = "world"){
    }
}

并设置调用所需的默认值,Foo是一个应该处理所有默认值的单个类,否则它似乎用于不同目的

答案 1 :(得分:3)

要解决歧义,您应该使第二种方法具有必需参数:

public class Foo
{
    public Foo(string bar = "hello"){
    }

    public Foo(string bar, string barrier = "world"){
    }
}

这是使方法解决方案具有确定性的唯一方法。

但正如已经指出的那样,该默认参数是无用的,因为在任何其他情况下它将落入第二个构造函数。更好的选择是删除第一个构造函数,但是如果这样做取决于内部的实现:

public class Foo
{
    public Foo(string bar = "hello", string barrier = "world"){
    }
}

答案 2 :(得分:0)

只需创建一个方法来检查string.isNullOrEmpty

的两个参数
static void Main(string[] args)
{
    testme("DD", "jj");
    Console.ReadLine();
}


public static void testme(string d="", string s = "")
{
    if (string.IsNullOrWhiteSpace(d) && string.IsNullOrWhiteSpace(s))
        return;
    if(string.IsNullOrEmpty(d))
        Console.Write(s);
    if (string.IsNullOrEmpty(s))
        Console.Write(d);
}

答案 3 :(得分:0)

只需使用一个构造函数就可以很简单地解决这个问题。我已经添加了一些额外的代码来促进一个简单的演示:

public class Foo
{
    private string _bar;
    private string _barrier;

    public Foo(string bar = "hello", string barrier = "world"){
        _bar = bar;
        _barrier = barrier;
    }

    public void show()
    {
        Console.WriteLine("_bar = " + _bar + " , _barrier = " + _barrier);
    }
}

然后所有这些组合都有效......

Foo a = new Foo();
a.show();
Foo b = new Foo("b");
b.show();
Foo c = new Foo(barrier: "c");
c.show();
Foo d = new Foo("d", "e");
d.show();

...并产生以下输出:

  

_bar = hello,_barrier = world

     

_bar = b,_barrier = world

     

_bar =你好,_barrier = c

     

_bar = d,_barrier = e

答案 4 :(得分:0)

也许你不需要公共建设者?尝试这样的事情:

class Program
{
    static void Main (string[] args)
    {
        var person = Person.FromName ();
    }
}

public class Person
{
    private Person (string name, string surname) { }

    public static Person FromName (string name = "John") => new Person (name, "Smith");

    public static Person FromFullName (string name = "John", string surname = "Smith") => new Person (name, surname);
}

当然Person类只是一个例子(坏例子:P),但你应该明白这个想法。

相关问题