我有一个包含两个构造函数的类:
public class Foo
{
public Foo(string bar = "hello"){
}
public Foo(string bar = "hello", string barrier = "world"){
}
}
现在,当我想用1个参数调用构造函数时,我可以调用:
new Foo();
但是我得到了一个模糊的引用错误,因为Visual Studio不知道我想要使用哪个构造函数。如何在不传递参数的情况下指定我想要的构造函数?
答案 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),但你应该明白这个想法。