如何在C#中从datareader强制转换空布尔值?

如何在C#中从datareader强制转换空布尔值?,c#,casting,boolean,datareader,C#,Casting,Boolean,Datareader,我尝试使用以下方法从数据库强制转换空布尔值: bool? primaryFlag = reader["primaryflag"] is DBNull ? null: (bool?)reader["primaryflag"]; 我一直得到一个指定的强制转换无效异常。我使用的方法有什么问题?您不能直接将其强制转换为可空的。但您可以将用作运算符: bool? primaryFlag = reader["primaryflag"] as bool?; 这是因为如果值为DBNull.value,则强制

我尝试使用以下方法从数据库强制转换空布尔值:

bool? primaryFlag = reader["primaryflag"] is DBNull ? null: (bool?)reader["primaryflag"];

我一直得到一个指定的强制转换无效异常。我使用的方法有什么问题?

您不能直接将其强制转换为
可空的
。但您可以将
用作
运算符:

bool? primaryFlag = reader["primaryflag"] as bool?;
这是因为如果值为
DBNull.value
,则强制转换将失败,因此它将正确分配
bool?
,即
null

或者这个不那么优雅的版本:

bool? primaryFlag = null;
int colOrdinal = reader.GetOrdinal("primaryflag");
if(!reader.IsDBNull(colOrdinal))
    primaryFlag = reader.GetBoolean(colOrdinal);

您还必须使用
(bool?)强制转换
null
值。null

问题是读取器中的值从来不是
bool?

当然,如果您强制转换为
bool
,您将在三元上得到一个错误,因为没有编译器可以推断的公共类型。我使用了一个简单的技巧:

reader["primaryFlag"] is DBNull ? default(bool?) : (bool)reader["primaryFlag"];
default(bool?
的意思与运行时的
null
完全相同,但就编译器而言,它使null“类型化”

将此作为扩展方法也非常方便,因此您可以执行以下操作

reader.GetNullable<bool>("primaryFlag")
reader.GetNullable(“primaryFlag”)

有两种逻辑解决方案: 1正在将DB值强制转换为所需任务:

bool? primaryFlag = (bool?)reader["primaryflag"]
2与您的方法更相似:

bool? primaryFlag = reader["primaryflag"] is DBNull ? (bool?) null: (bool)reader["primaryflag"];