正确的布尔值定义为不可为空的运算符

本文关键字:运算符 定义 布尔值 | 更新日期: 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,正如勒内·沃格特所建议的那样。

作为旁注:您应该研究命名约定。属性和类应该是骆驼案例,因此它将是BlockedTransportToAccount

如果你的readerDbDataReader的派生物(例如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);

由于IsDbNullGetBoolean使用列索引作为参数而不是列名,因此您需要先使用 GetOrdinal 缓存索引。

正如帕特里克已经建议的那样,尝试改进你的命名约定。