我正在尝试使用c#object initializer创建一个对象。但是该类已经有一个构造函数,根据需要有一个参数,我不需要默认的construcor,所以我没有提供一个。当类中有用户提供的构造函数时,编译器也不会提供默认构造函数。
现在,当我尝试使用对象初始值设定项创建此类的实例时出现问题:
public class Foo
{
public int Data { get; set; }
public Foo(int Data)
{
this.Data = Data;
}
}
我像这样实例化这个类:
Foo f=new Foo { Data=10};
现在我收到编译时错误:
“Foo不包含带0参数的构造函数”
我知道错误,这是因为缺少默认构造函数。当我不需要默认构造函数时,为什么我应该只使用对象初始化程序?所以我只是想知道,有没有其他方式(样式,语法)我可以使用这个对象初始化程序而不显式提供默认构造函数?
我检查了this MSDN link,它说如果你的类中有一个PRIVATE默认构造函数,你就不能使用对象初始值设定项,但我这里没有私有的默认构造函数。
答案 0 :(得分:5)
如果您已经有一个构造函数接受正确初始化对象所需的参数,那么为什么不使用正确的构造函数语法?
Foo f = new Foo { Data = 10 }; // What you want (object initializer syntax)
Foo f = new Foo ( Data : 10 ); // What you can get (constructor syntax)
答案 1 :(得分:4)
然后不要使用对象初始化器。只需通过构造函数传递值:
Foo f=new Foo(10);
如果您想使用对象初始化器,您可以:
Foo f=new Foo(10){ Data=10};
但是你要设置两次相同的值,所以没有意义
答案 2 :(得分:3)
对象初始化器语法是这样的简写:
var x = new MyClass();
x.Property1 = "value1";
x.Property2 = "value2";
x.Property3 = "value3";
...
您可以通过创建具有虚拟内容和断点的默认构造函数来验证这一点,然后使用对象初始值设定项实例化该类;断点将被命中,即使您没有显式调用默认构造函数。
所以当你做var x = new MyClass { Property1 = "value1", Property2 = "value2, Property3 = "value3" };
时。你 调用默认构造函数。如果它丢失了,你会收到你注意到的编译时错误。