正确的bool定义为非可空操作符

时间:2016-07-14 11:35:47

标签: c#

var account = new TRANSPORT_TO_ACCOUNT
{
    TransportLayerId = reader["ID"] as string,
    ...
    BLOCKED = reader["BLOCKED"] as bool,
};
accounts.Add(account);

我的代码存在问题。

  

as运算符必须与引用类型或可空类型一起使用('bool'是不可为空的值类型)

在这种情况下,如何正确声明BLOCKED

2 个答案:

答案 0 :(得分:5)

如果你确定该属性是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<head>

答案 1 :(得分:2)

如果您的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来缓存索引。

正如Patrick已经建议的那样,请尝试改进您的命名约定。

相关问题