具有最初无效字段的结构

Bad*_*Cat 1 c# struct

我正在尝试创建一个包含两个字段的结构,我可以在创建后直接检查它是否有效/无效.因为这两个字段是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; }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,测试任何创建的InputCodeSet结果在创建后IsValid始终为true,即使未设置主要或辅助也是如此.显然,可选构造函数参数中的默认值被忽略?有什么其他方法让这个工作?我想主要使用对象初始化器语法...

var inputCode1 = new InputCodeSet { primary = InputCode.55 }
Run Code Online (Sandbox Code Playgroud)

Bol*_*ock 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; }
    }
}
Run Code Online (Sandbox Code Playgroud)