2010-01-19 2 views
9

Как я могу получить 0 как целое значение от (int)null.Я хочу "(int) null", чтобы вернуть мне 0

EDIT 1: Я хочу создать функцию, которая вернет мне значения по умолчанию для нулевого представления в их соответствующих типах данных.

EDIT 2: Как я работать в этом сценарии для использования по умолчанию .

(INT) Значение

Где Значение может быть пустым или любое целое значение. Я не знаю тип данных во время выполнения. Но я уверяю, что значение должно содержать только значение null или целое число.

ответ

21

Вы можете использовать Nullable структуру

int value = new Nullable<int>().GetValueOrDefault(); 

Вы также можете использовать default ключевое слово

int value = default(int); 

После 2-го редактирования:

Вам нужна функция, которая получит любой тип параметра, поэтому объект будет использоваться.Ваша функция аналогична методу Field<T> расширения на DataRow

public static T GetValue<T>(object value) 
{ 
    if (value == null || value == DBNull.Value) 
     return default(T); 
    else 
     return (T)value; 
} 

Используя эту функцию, если вы хотите Int (и вы ожидаете значение быть Int) Вы называете это нравится:

int result = GetValue<int>(dataRow["Somefield"]); 
+0

Согласен. Не нужно изобретать колесо - используйте функцию сборки на языке - типы с нулевым значением. –

+0

@ Pierre-Alain Vigeant: нужно больше объяснений по поводу "new Nullable () .GetValueOrDefault();" о том, что и как это работает. Я немного запутался, используя . Не знаю об этом виде кода синтаксиса –

+4

@ShantanuGupta Тип с нулевым именем типа 'int?' Предоставляет метод GetValueOrDefault(). Этот метод возвращает значение, если оно не является нулевым или значением по умолчанию для типа (0 для int), если значение равно null. –

0

Вы не можете наложить null на int, поскольку int является типом значения. Вы может лить его в int?.

Чего вы хотите достичь?

+0

@thecoop: Я пытаюсь сделать общую функцию для возврата значений по умолчанию для всех типов данных. –

34

Вы можете использовать ключевое слово default, чтобы получить значение по умолчанию любого типа данных:

int x = default(int);  // == 0 
string y = default(string); // == null 
// etc. 

Это работает с родовыми параметрами, а также:

Bar<T> Foo<T>() { 
    return new Bar<T>(default(T)); 
} 

В случае, если есть переменная типа object, которые могут содержать null или значение типа int, вы можете использовать nullable types и тому ?? operator, чтобы преобразовать его безопасно в целое число:

int a = 42; 
object z = a; 
int b = (int?)z ?? 0;  // == 42 
int c = (int?)null ?? 0;  // == 0 
+3

+1: вам также не нужно делать свою собственную функцию. –

+1

+1 для ??? оператор. –

+0

+1, не знал о ключевом слове по умолчанию. – iandisme

1

Общий метод, который возвращает экземпляр литья объекта или значение по умолчанию, может быть реализован следующим образом:

static T Cast<T>(object value) { 
    if (value is T) 
     return (T)value; 
    else 
     return default(T); 
} 

Таким образом, используя действительное значение даст само значение:

int value = Cast<int>(4); //value = 4 

и нулевое значение получит по умолчанию:

int value = Cast<int>(null); //value = 0 

Обратите внимание, что поскольку метод принимает объект в качестве аргумента , это приведет к боксу при использовании с объектами struct (например, int).

0

Метод обобщенного класса, который ничего не возвращает работы:

Class GetNull(Of T) 
     Public Shared Function Value() As T 
      Return Nothing 
     End Function 
End Class 



Debug.Print(GetNull(Of Integer).Value()) 
0

Вам нужен тип возврата Nullable(Of Integer).

Смежные вопросы