可以使用?? (合并运算符)与DBNull?

Abe*_*ler 20 .net c# null-coalescing-operator

如果我有类似以下的代码:

while(myDataReader.Read())
{
  myObject.intVal = Convert.ToInt32(myDataReader["mycolumn"] ?? 0);
}
Run Code Online (Sandbox Code Playgroud)

它抛出错误:

无法将对象从DBNull强制转换为其他类型.

定义intVal为可空int不是一个选项.有没有办法让我做到以上几点?

Edy*_*dyn 16

这是另一个选择:

while (myDataReader.Read())
{
    myObject.intVal = (myDataReader["mycolumn"] as int? ?? 0);
}
Run Code Online (Sandbox Code Playgroud)


Bry*_*her 14

你能用扩展方法吗?(写在我的头顶)

public static class DataReaderExtensions 
{
    public static T Read<T>(this SqlDataReader reader, string column, T defaultValue = default(T))
    {
        var value = reader[column];

        return (T)((DBNull.Value.Equals(value))
                   ? defaultValue
                   : Convert.ChangeType(value, typeof(T)));
    }
}
Run Code Online (Sandbox Code Playgroud)

你会像以下一样使用它:

while(myDataReader.Read())
{
  int i = myDataReader.Read<int>("mycolumn", 0);
}
Run Code Online (Sandbox Code Playgroud)


Pad*_*ddy 6

你能简单地使用Int32.Tryparse吗?

int number;
bool result = Int32.TryParse(myDataReader["mycolumn"].ToString(), out number);
Run Code Online (Sandbox Code Playgroud)

根据MSDN,number如果转换失败,将包含0

  • 这不编译,是吗?数据读取器索引器返回一个对象引用,TryParse接受一个字符串参数.当然,你可以在对象上调用`ToString`,但构造int的字符串表示只是为了解析它是相当低效的.拆箱转换会更有效率. (5认同)

Mik*_*sen 5

怎么样的:

object x = DBNull.Value;
int y = (x as Int32?).GetValueOrDefault(); //This will be 0
Run Code Online (Sandbox Code Playgroud)

或者在你的情况下:

int i = (myDataReader["mycolumn"] as Int32?).GetValueOrDefault();
Run Code Online (Sandbox Code Playgroud)