如何为struct(结构体)添加多个重载构造函数?
报错原因分析
- 构造函数链调用语法错误:C# 中调用当前结构体的其他构造函数,需要写在构造函数签名的尾部,使用
: this(参数列表)的语法,不能写在构造函数的内部代码块中。你将this(a, null)写在构造函数大括号内,编译器会将其识别为普通方法调用,而不存在名为this的方法,因此触发「Method name expected」报错。 - 参数类型不匹配:字段
b是int类型,属于非可空值类型,不能传入null作为参数,该语法本身不合法。 - 不满足结构体构造函数赋值规则:C# 要求结构体的所有实例构造函数,必须在返回前为所有字段完成赋值。你的单参数构造函数既没有手动为
a、b赋值,也没有正确调用其他构造函数完成赋值,因此触发字段未完全赋值的报错;同时你在未完成所有字段赋值的前提下尝试在构造函数内部使用this,就会触发this对象不可用的报错。
正确实现方案
你可以任选以下任意一种方式实现结构体的多构造函数:
方案1:使用正确的构造函数链语法
struct test { public int a; public int b; // 构造函数签名后加 : this(参数) 调用双参数构造,给b传入默认值0 public test(int a) : this(a, 0) { } public test(int a, int b) { this.a = a; this.b = b; } }
方案2:单参数构造函数直接为所有字段赋值
struct test { public int a; public int b; public test(int a) { this.a = a; this.b = 0; // 手动给所有字段赋值即可 } public test(int a, int b) { this.a = a; this.b = b; } }
方案3:使用参数默认值简化实现(C# 4.0及以上版本支持)
如果没有特殊逻辑要求,可以直接给构造函数参数设置默认值,只用一个构造函数即可覆盖两种调用场景:
struct test { public int a; public int b; // b的默认值设为0,调用时可以只传a,也可以同时传a和b public test(int a, int b = 0) { this.a = a; this.b = b; } }
内容的提问来源于stack exchange,提问作者Recessive
相关产品推荐
相关产品推荐

