如何初始化不可空类型?结构体DeviceState未赋值报错求助
不可空值类型DeviceState字段的初始化解决方案
问题原因
C#中值类型(结构体属于值类型)的字段不会自动完成初始化,必须显式为所有字段赋值后,才能使用结构体实例。你只给connected字段赋了值,但device字段未初始化,所以编译器抛出Use of possibly unassigned field 'device'错误。
几种可行的解决方法
直接初始化device字段
在访问controller.device之前,显式给它赋值:XControllers controller; controller.connected = false; // 将device初始化为默认实例 controller.device = new XInput.DeviceState(); // 现在可以正常访问State属性 var previousState = controller.device.State;使用对象初始化器创建实例
声明结构体实例时,用对象初始化器一次性完成所有字段的赋值:XControllers controller = new XControllers { connected = false, device = new XInput.DeviceState() }; var previousState = controller.device.State;给结构体添加构造函数
给XControllers结构体添加构造函数,强制初始化所有字段,避免遗漏:struct XControllers { public XInput.DeviceState device; public bool connected; public XControllers(bool connected, XInput.DeviceState device) { this.connected = connected; this.device = device; } } // 通过构造函数创建并初始化实例 XControllers controller = new XControllers(false, new XInput.DeviceState()); var previousState = controller.device.State;利用值类型的默认初始化
如果DeviceState的默认值(所有成员为对应类型的默认值)符合你的需求,直接用new XControllers()创建实例即可——值类型实例通过new创建时,所有字段会自动被初始化为默认值:XControllers controller = new XControllers(); // connected默认就是false,这行可以省略 controller.connected = false; var previousState = controller.device.State;
内容的提问来源于stack exchange,提问作者user2144480
相关产品推荐
相关产品推荐

