正确的布尔值定义为不可为空的运算符
本文关键字:运算符 定义 布尔值 | 更新日期: 2023-09-27 17:56:51
var account = new TRANSPORT_TO_ACCOUNT
{
TransportLayerId = reader["ID"] as string,
...
BLOCKED = reader["BLOCKED"] as bool,
};
accounts.Add(account);
我有这个代码的问题。
as 运算符必须与引用类型或可为空的类型一起使用("bool"是不可为空的值类型)
在这种情况下,我应该如何正确声明BLOCKED
?
如果您确定该属性是 bool
,则只需强制转换它:
var account = new TRANSPORT_TO_ACCOUNT
{ TransportLayerId = (string)reader["ID"]
, BLOCKED = (bool)reader["BLOCKED"]
};
accounts.Add(account);
或者,如果您不确定是否有值:
, BLOCKED = (bool?)reader["BLOCKED"]
或者,如果您甚至不确定它是一个(可为空的)布尔字段:
, BLOCKED = reader["BLOCKED"] as bool?
如果读者是DbDataReader
,你可以使用GetBoolean
,正如勒内·沃格特所建议的那样。
作为旁注:您应该研究命名约定。属性和类应该是骆驼案例,因此它将是Blocked
和TransportToAccount
。
如果你的reader
是DbDataReader
的派生物(例如SqlDataReader
),你可以使用IsDbNull()
和GetBoolean()
:
int blockedIndex = reader.GetOrdinal("BLOCKED");
var account = new TRANSPORT_TO_ACCOUNT
{
TransportLayerId = reader["ID"] as string,
...
BLOCKED = reader.IsDbNull(blockedIndex)
? (bool?)null
: reader.GetBoolean(blockedIndex)
};
accounts.Add(account);
由于IsDbNull
和GetBoolean
使用列索引作为参数而不是列名,因此您需要先使用 GetOrdinal
缓存索引。
正如帕特里克已经建议的那样,尝试改进你的命名约定。