int.TryParse = null, если не числовой? - PullRequest
13 голосов
/ 13 ноября 2009

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

с:

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

get "не может конвертировать из 'out string' в 'out int'

что делать?

EDIT:

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

/ M

Ответы [ 8 ]

27 голосов
/ 13 ноября 2009

Прежде всего, почему вы пытаетесь разобрать строку в 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;
    }
}
14 голосов
/ 13 ноября 2009

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

int? value;
int dummy;
if(Int32.TryParse(categoryID, out dummy)) {
    value = dummy;
}
else {
    value = null;
}
return value;
9 голосов
/ 13 ноября 2009

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

public int? ParseToNull(string categoryId)
{
    int id;
    return int.TryParse(categoryId, out id) ? (int?)id : null;
}
2 голосов
/ 11 июня 2015

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

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

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

0 голосов
/ 13 ноября 2009

Хочешь сделать что-то подобное?

public int? Parse(string categoryID) 
{
  int value;
  if (int.TryParse(categoryID, out value))
  {
    return value;
  }
  else
  {
    return null;
  }
}
0 голосов
/ 13 ноября 2009

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

public int? ParseInt(string categoryID) 
{
    int theIntValue;
    bool parseOk = int.TryParse(categoryID, out theIntValue);
    if(parseOk) {
        return theIntValue;
    } else {
        return null;
    }
}
0 голосов
/ 13 ноября 2009

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

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

Тебе нужно что-то вроде этого ...

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

int.TryParse(strCategoryID, out categoryID);
0 голосов
/ 13 ноября 2009

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

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

использовать попробуйте и поймать

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