2016-05-19 6 views
3

У меня есть метод, который может принимать параметры с нулевым значением, поскольку он заполняется из таблицы с нулевыми столбцами.как подавать параметр с нулевым значением в методе?

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

но оба они дают мне ошибку

«Оператор ?? не могут быть применены к операндам типа междунар и нулевой

последнего я попытался это:

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

это один компилирует, но дает ошибку времени выполнения

«указанный бросок не действителен»

Так как я могу это сделать? Идея состоит в том, что значение параметра заполняется либо значением из таблицы, либо нулевым.

ответ

7

Вы можете использовать метод DataRow расширения Field, который поддерживает NULLABLE типов:

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

Попробуйте с помощью as (безопасный бросок, который возвращает null, если он не):

test((int)row["ID"], row["value"] as int?); 
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); 
}