2009-11-13 5 views
12

Есть ли способ возврата null, если он не может разобрать строку в int?int.TryParse = null, если не числовое?

с:

public .... , string? categoryID) 
{ 
int.TryParse(categoryID, out categoryID); 

получение «не может конвертировать из 'из строки' для 'из Int'

что делать

EDIT:

больше не актуальны из-за Ограничения asp.net - это способ решить проблему

/M

+2

Почему вы разбираете его в int, когда хотите сохранить его в строке? –

+2

Кстати, строка является ссылочным типом, поэтому вы не должны делать ее нулевой. (это вообще компиляция?) –

+0

Я использую это для asp.net mvc, поэтому categoryID отображается из URL-адреса, поэтому я получаю ошибку, если я передаю строку в url –

ответ

24

Прежде всего, почему вы пытаетесь разобрать строку в int и вставить результат обратно в строку?

Метод подписи

bool int.TryParse(string, out int) 

так что вы должны дать переменную типа int в качестве второго аргумента. Это также означает, что вы не получите null, если синтаксический анализ завершится неудачей, вместо этого метод просто вернет false. Но вы можете легко собрать это вместе:

int? TryParse2(string s) { 
    int i; 
    if (!int.TryParse(s, out i)) { 
     return null; 
    } else { 
     return i; 
    } 
} 
+0

Eep, спасибо, Гарри. Написание кода без его компиляции вызывает такие ошибки :-) – Joey

+1

Я уверен, что это создаст хороший метод расширения – cost

0

** этот ответ был сильно проголосован ** Хотя это возможное решение - это плохой результат, разумный и, вероятно, не лучший выбор для программирования.

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

использование попытаться поймать

try 
{ 
res = Int32.Parse(strVAR) 
} 
catch(exception ex) 
{ 
return null; 
} 
+1

Лучше использовать 'TryParse'. – jason

+0

Ну, это еще вариант .... – Dani

+1

С тех пор, как C# 2.0 вышел, TryParse почти всегда лучше, чем занимать исключения. – Bomlin

0

Int является тип значения, который означает, что нет такой вещи, как null int. Поэтому нет, TryParse никогда не изменит параметр out так, чтобы он был нулевым.

Но проблема в том, что вы передаете строку в параметр out TryParse, когда она ожидает целое число.

Вам нужно что-то вроде этого ...

Int categoryID = 0; 
string strCategoryID = "somestringmaybeitsaninteger"; 

int.TryParse(strCategoryID, out categoryID); 
+0

Существует nullable int: int? – Dani

+0

Dani: 'TryParse' однако возвращает' int', а не 'Nullable '. – Joey

+0

int? на самом деле не является целым типом ... это сокращенно для System.Nullable . – jerhinesmith

0

TryParse вернет ложь, если строка не может быть разобран. Вы можете использовать этот факт, чтобы вернуть либо разобранное значение, либо null. Во всяком случае, я думаю, что вы намерены вернуться int? из метода, то это будет что-то вроде этого:

public int? ParseInt(string categoryID) 
{ 
    int theIntValue; 
    bool parseOk = int.TryParse(categoryID, out theIntValue); 
    if(parseOk) { 
     return theIntValue; 
    } else { 
     return null; 
    } 
} 
14

Вот правильное использование Int32.TryParse:

int? value; 
int dummy; 
if(Int32.TryParse(categoryID, out dummy)) { 
    value = dummy; 
} 
else { 
    value = null; 
} 
return value; 
+4

Или: значение = int.TryParse (categoryID, out dummy)? dummy: null; –

+1

Да, абсолютно, но это непрозрачно для неофита. – jason

+0

@ Dan: не компилируется ;-) Но да, я предпочитаю это решение (плюс один актер, чтобы он скомпилировался). –

0

Вы хотите сделать что-то вроде это?

public int? Parse(string categoryID) 
{ 
    int value; 
    if (int.TryParse(categoryID, out value)) 
    { 
    return value; 
    } 
    else 
    { 
    return null; 
    } 
} 
9

Как насчет этого?

public int? ParseToNull(string categoryId) 
{ 
    int id; 
    return int.TryParse(categoryId, out id) ? (int?)id : null; 
} 
+0

. Это решение может быть полезно для превращения в метод расширения. –

+0

Это уже метод расширения в моем приложении, но я не знал, что такое морган, поэтому я сохранил его как метод. – DigitalNomad

+0

вам не нужен листинг на идентификаторе. Значение int или null является допустимым Nullable :). – Khanzor

2

Простейшим ...

Int N = Int.TryParse(somestring, N) ? N : 0; 

Это работает потому, что это вычисляются слева направо. Нуль не так просто.

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