我有这个代码:
public class NewFrame
{
public NewFrame(string iconSource = Const.Car,
string iconColor = Const.Red)
{
当我尝试使用它时,它告诉我缺少默认构造函数。如何添加其中之一并仍然使代码使用 iconBackgroundColor 和 IconSource 的默认值?我认为使用 = Const 添加这些默认值。会让它工作,但它似乎不认为我的构造函数是默认的(没有参数)。
答案 0 :(得分:7)
您只需要添加另一个空重载并使用默认值调用所需的构造函数。见下文:
public class NewFrame
{
public NewFrame() : this(Const.Car, Const.Red){
}
public NewFrame(string iconSource,
string iconColor)
{
...
}
}
答案 1 :(得分:2)
通过有两个可选参数,您实际上并没有在后台创建 4 个不同的构造函数声明(一个带有两个参数,一个带有第一个参数,一个带有第二个参数,一个都没有)。仍然只有一个构造函数,有两个参数。只是 C# 认识到参数是可选的,并且有语法糖可以让你在调用构造函数时省略它们。
然而,如果你使用反射来创建你的类的一个实例(可能无论需要默认构造函数做什么),并且你试图调用无参数构造函数,它不会找到一个,因为没有反射中的语法糖。
这是一个例子:
class MainClass
{
public static void Main(string[] args)
{
Type t = typeof(MainClass);
object o = Activator.CreateInstance(t, 1);
Console.WriteLine(o);
}
public MainClass(int a = 10)
{
}
}
如果您使用 typeof(MainClass).GetConstructors()
,它会告诉您只有一个。
要实际声明默认构造函数,您可以执行以下操作:
public class NewFrame
{
public NewFrame(string iconSource = Const.Car,
string iconColor = Const.Red)
{
...
}
public NewFrame() : this(Const.Car, Const.Red) { }
}
答案 2 :(得分:1)
无论如何,当我做这样的事情时,我会选择@VyacheslavBenedichuk 的回答所显示的路线。
我不确定您的投诉是什么。这段代码为我编译:
public class TestConstructor
{
public TestConstructor(string what = Const.Car, string color = Const.Red)
{
}
public static void Test()
{
var tc = new TestConstructor();
}
public class Const
{
public const string Car = "car";
public const string Red = "red";
}
}
您对 Const.Car
和 Const.Red
的定义是什么样的?您在哪里看到错误?
但是,如果您使用需要默认构造函数的东西,那么这将不起作用。例如,这将在运行时失败:
var tc2 = Activator.CreateInstance(typeof(TestConstructor));
请,当您报告错误时,请准确描述它 - 特别是说它是运行时错误还是编译时错误,错误的确切措辞,以及发生错误的上下文。在这种情况下(调用 CreateInstance
)将导致 System.MissingMethodException: 'No parameterless constructor defined for this object.'
在这种情况下,您需要遵循@VyacheslavBenedichuk 的建议