我正在尝试创建一个具有两个字段的结构,创建后可以直接检查它们是否有效。由于默认情况下这两个字段为0
,因此我想检查它们是否为-1
...
public struct InputCodeSet
{
public int primary;
public int secondary;
public InputCodeSet(int primary = -1, int secondary = -1)
{
this.primary = primary;
this.secondary = secondary;
}
public bool IsValid
{
get { return primary > -1 && primary < InputCode.MAX && secondary > -1 && secondary < InputCode.MAX; }
}
}
尽管对任何创建的InputCodeSet
进行测试都会导致IsValid
在创建后始终为true,即使未设置主要或次要设置也是如此。显然,可选构造函数参数中的默认值被忽略了吗?还有其他方法可以使它正常工作吗?我想主要使用对象初始化器语法...
var inputCode1 = new InputCodeSet { primary = InputCode.55 }
答案 0 :(得分:7)
结构具有单独的默认无参数构造函数,即使所有参数都是可选的,调用它们时也不会调用带有参数的构造函数重载。因此,在不向其构造函数传递任何参数的情况下创建结构将调用其默认构造函数,并导致其字段初始化为0,而完全忽略带有可选参数的构造函数。
如果使用默认的无参数构造函数实例化struct对象,则会根据其默认值分配所有成员。
也许您可以使这些字段为空,并检查null而不是-1:
public struct InputCodeSet
{
public int? primary;
public int? secondary;
public InputCodeSet(int? primary = null, int? secondary = null)
{
this.primary = primary;
this.secondary = secondary;
}
public bool IsValid
{
get { return primary != null && primary < InputCode.MAX && secondary != null && secondary < InputCode.MAX; }
}
}