我有两个构造函数,在同一个类中,有多个参数(Visual Studio上的c#):
public class Example
{
{
public string arg1 { get; set; }
public string arg2 { get; set; }
public string arg3 { get; set; }
public string arg4 { get; set; }
public string arg5 { get; set; }
public string arg6 { get; set; }
}
public Example(string arg1, string arg2, string arg3){
this.arg1 = arg1;
this.arg2 = arg2;
this.arg3 = arg3;
}
public Example(string arg4, string arg5, string arg6){
this.arg4 = arg4;
this.arg5 = arg5;
this.arg6 = arg6;
}
}
在一个单独的aspx.cs文件中,在受保护的字符串方法下,我根据条件调用这两个构造函数。
Example ExampleObj = null;
protected string Method(object sender, EventArgs e){
if (condition){
ExampleObj = Constructor2(parameter1, parameter2, parameter3, parameter4, parameter5, parameter6);
}
else
{
ExampleObj = Constructor1(parameter1, parameter2, parameter3);
}
}
如果condition为true,我想调用第二个构造函数,除了Constructor1中的参数之外还有参数。我想,我可以说构造函数2覆盖或扩展构造函数1。 经过我所有的研究,我试过了
public Constructor2(string arg4, string arg5, string arg6)
:this(arg1, arg2, arg3) {
this.arg4 = arg4;
this.arg5 = arg5;
this.arg6 = arg6;
}
仍然,我收到错误'这个()中的参数需要一个对象引用。根据我的要求,我不能使我的主要方法静态。我找到了一些解决方案,说创建实例或更改为静态,但我无法将其应用于我的代码(获取错误)。
另外,我不清楚我是否应该在this()构造函数中声明数据类型。如果有人知道解决方法,请帮助我。我可能会遗漏一些东西。
谢谢!
答案 0 :(得分:2)
有效的构造函数应该与该类具有相同的名称。
您可以拥有2个构造函数,但它们需要具有相同的名称和不同的参数列表。否则,编译器在使用它们时无法区分它们。
这项工作正常:
class Example
{
public Example(string arg1)
{
this.arg1 = arg1;
}
public Example(string arg1, string arg2)
:this(arg1)
{
this.arg2 = arg2;
}
}
答案 1 :(得分:0)
c#编译器无法区分两个构造函数,因为它们具有相同的签名(方法名称,参数的数量和类型)。如果每个构造函数有不同数量的参数,或者如果任何参数的类型不同,则代码将编译。
我猜你正在寻找这样的东西:
public class Example
{
public string arg1 { get; set; }
public string arg2 { get; set; }
public string arg3 { get; set; }
public string arg4 { get; set; }
public string arg5 { get; set; }
public string arg6 { get; set; }
public Example(string arg1, string arg2, string arg3)
{
this.arg1 = arg1;
this.arg2 = arg2;
this.arg3 = arg3;
}
public Example(string arg1, string arg2, string arg3, string arg4, string arg5, string arg6)
: this(arg1, arg2, arg3)
{
this.arg4 = arg4;
this.arg5 = arg5;
this.arg6 = arg6;
}
}