如何添加默认构造函数并让它调用另一个构造函数并使用默认值?

时间:2021-01-10 05:16:51

标签: c#

我有这个代码:

public class NewFrame 
{

    public NewFrame(string iconSource = Const.Car,
        string iconColor = Const.Red)
    {

当我尝试使用它时,它告诉我缺少默认构造函数。如何添加其中之一并仍然使代码使用 iconBackgroundColor 和 IconSource 的默认值?我认为使用 = Const 添加这些默认值。会让它工作,但它似乎不认为我的构造函数是默认的(没有参数)。

3 个答案:

答案 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.CarConst.Red 的定义是什么样的?您在哪里看到错误?

但是,如果您使用需要默认构造函数的东西,那么这将不起作用。例如,这将在运行时失败:

var tc2 = Activator.CreateInstance(typeof(TestConstructor));

,当您报告错误时,请准确描述它 - 特别是说它是运行时错误还是编译时错误,错误的确切措辞,以及发生错误的上下文。在这种情况下(调用 CreateInstance)将导致 System.MissingMethodException: 'No parameterless constructor defined for this object.'

在这种情况下,您需要遵循@VyacheslavBenedichuk 的建议