【问题标题】:Checking null and enforce to 0检查 null 并强制为 0
【发布时间】:2012-08-02 13:54:27
【问题描述】:

我从数据列返回一个整数列表。这个特定的列是 (int,null)。 但我遇到了一个例外。

Specified cast is not valid.

代码:

public List <int> GetSortOrder(DataTable dt,string columnName)
{
    List<int> Orders = new List<int>();
    foreach (DataRow row in dt.Rows)
    {
        Orders.Add((int)row[columnName]);
    }
    return Orders;
}

我想要的是如果它为空,然后将其强制为 0。 我应该使用可空类型 int 吗?或者只是简单地使用 if ... else...?

【问题讨论】:

    标签: c# ado.net null


    【解决方案1】:
            Orders.Add((int)(row[columnName] ?? 0));
    

    【讨论】:

    • 它被称为“空合并运算符”
    • 如果我使用.Net 3.5,我可以使用吗??
    • @Skeet 会吗??操作员使用 DBNull.Value? DataRow 通常存储 DBNull.Value 但不存储空值。我已经测试过 DBNull.Value ?? 0 并得到 DBNull.Value。
    【解决方案2】:

    该列实际上存储 DBNull.Value 而不是通常的 C# null。这就是为什么运营商??不管用。要检查列是否为空,请使用 row.IsNull 方法:

    Orders.Add(row.IsNull(columnName) ? 0 : (int)row[columnName]);
    

    操作员 ??不适用于 DBNulls。

    您可能还想查看此链接:Handle DBNull in C# 以获得将 DBNull-able int 转换为 int 的一些有效示例?

    【讨论】:

      【解决方案3】:

      我也会使用 int 吗?我喜欢 Field 方法:

      int? myInt = row.Field<int?>(columnName);
      

      【讨论】:

        【解决方案4】:

        我建议int?:

        Orders.Add(((int?)row[columnName]).GetValueOrDefault());
        

        在我看来,它使意图和代码保持简洁明了,而 if/else 并没有做到这一点。使用?? 0 作为其他答案的建议也很好。

        【讨论】:

        • 根据原始问题,代码的意图是返回一个默认为 0 的整数。我看不出在列表中允许 null 值如何提高清晰度或意图 - 这似乎与两者相矛盾。
        【解决方案5】:

        应该可以的:

        public List <int> GetSortOrder(DataTable dt,string columnName)
        {
            List<int> Orders = new List<int>();
            int? nullableInt;
            foreach (DataRow row in dt.Rows)
            {
                nullableInt = (int)row[columnName];
                Orders.Add(nullableInt??0);
            }
            return Orders;
        }
        

        【讨论】:

        • 不,当您尝试将 null 值强制转换为 int 时,您仍然会收到错误消息。你需要投到int?
        • 我不确定,因为我实际上并没有使用真实数据进行尝试。但它确实像那样编译......
        • 当然可以编译,因为 row[columnName] 是对象类型。在运行时抛出异常。顺便说一下,当 row[columnName] 为 DBNull.Value 时,(int)row[columnName] 和 (int?)row[columnName] 都会抛出异常。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-24
        • 2012-11-05
        • 1970-01-01
        • 2022-12-31
        • 2015-12-12
        • 1970-01-01
        相关资源
        最近更新 更多