如何在方法中提供可为空的参数?

时间:2016-05-19 08:21:28

标签: c# nullable

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

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填充。

3 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:0)

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);
}