【问题标题】:how fo feed a nullable parameter in a method?如何在方法中提供可为空的参数?
【发布时间】:2016-05-19 16:49:30
【问题描述】:

我有一个可以接受可为空参数的方法,因为它是从具有可为空列的表中填充的。

private void test(int ID, int? value)
{}

当调用这个方法时,我需要一些方法来给它一个可以为空的变量,这就是我的问题。 我试过这个:

foreach (DataRow row in DataTable1.Rows)
{
    test((int)row["ID"], (int?)row["value"]);
}

但它给了我一个铸造错误

“指定的强制转换无效”

所以我尝试了这个:

foreach (DataRow row in DataTable1.Rows)
{
    test((int)row["ID"], (int)row["value"] ?? DBnull.Value);
}  

还有这个:

foreach (DataRow row in DataTable1.Rows)
{
    test((int)row["ID"], (int)row["value"] ?? null);
}

但他们都给我错误

"运算符 ?? 不能应用于 int 和 null 类型的操作数

我尝试的最后一个是这样的:

foreach (DataRow row in DataTable1.Rows)
{
    test((int)row["ID"], (int?)row["value"] ?? null);
}

这个编译但给出运行时错误

“指定的强制转换无效”

那么我该怎么做呢? 这个想法是,参数值要么用表中的值填充,要么用 null 填充。

【问题讨论】:

    标签: c# nullable


    【解决方案1】:

    您可以使用支持可空类型的DataRow 扩展方法Field

    foreach (DataRow row in DataTable1.Rows)
    {
        int id = row.Field<int>("ID");
        int? value = row.Field<int?>("value");
        test(id, value);
    }
    

    【讨论】:

      【解决方案2】:

      尝试使用as(安全转换,如果失败则返回null):

      test((int)row["ID"], row["value"] as int?);
      

      【讨论】:

        【解决方案3】:
        foreach (DataRow row in DataTable1.Rows)
        {
           var id = row["ID"] as int? ??default(int);
           int? value = row["value"] as int? ??default(int?);
        
           test(id, value);
        }
        

        【讨论】:

          猜你喜欢
          • 2023-02-07
          • 1970-01-01
          • 2015-07-24
          • 2019-04-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多