Многократный оператор возврата СТРАННЫЙ? - PullRequest
5 голосов
/ 07 сентября 2011

Сегодня, играя с декомпилятором, я декомпилировал класс .NET C # Char, и есть странный случай, который я не понимаю

public static bool IsDigit(char c)
{
    if (char.IsLatin1(c) || c >= 48)
    {
        return c <= 57;
    }
    return false;
    return CharUnicodeInfo.GetUnicodeCategory(c) == 8;//Is this Line Reachable if Yes How does it work !
}

я использовал Telerik JustDecompile

Ответы [ 4 ]

3 голосов
/ 07 сентября 2011

Думаю, ваш декомпилятор может быть хитрым ... С Reflector я получаю:

public static bool IsDigit(char c)
{
   if (!IsLatin1(c))
   {
       return (CharUnicodeInfo.GetUnicodeCategory(c) == UnicodeCategory.DecimalDigitNumber);
   }
   return ((c >= '0') && (c <= '9'));
}

И с ILSpy я получаю:

public static bool IsDigit(char c)
{
   if (char.IsLatin1(c))
   {
      return c >= '0' && c <= '9';
   }
   return CharUnicodeInfo.GetUnicodeCategory(c) == UnicodeCategory.DecimalDigitNumber;
}
2 голосов
/ 07 сентября 2011

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

В платформе .NET 4.0 IL Spy показывает следующий код:

public static bool IsDigit(char c)
{
    if (char.IsLatin1(c))
    {
        return c >= '0' && c <= '9';
    }
    return CharUnicodeInfo.GetUnicodeCategory(c)
           == UnicodeCategory.DecimalDigitNumber;
}
1 голос
/ 07 сентября 2011

Я думаю, что ваш декомпилятор лжет.

Код dotPeek:

public static bool IsDigit(char c)
    {
      if (char.IsLatin1(c))
      {
        if ((int) c >= 48)
          return (int) c <= 57;
        else
          return false;
      }
      else
        return CharUnicodeInfo.GetUnicodeCategory(c) == UnicodeCategory.DecimalDigitNumber;
    }
1 голос
/ 07 сентября 2011

Похоже, используемый вами декомпилятор не очень хорош в своих действиях.

Вот вывод dotPeek для этого метода:

public static bool IsDigit(char c)
{
  if (!char.IsLatin1(c))
    return CharUnicodeInfo.GetUnicodeCategory(c) == UnicodeCategory.DecimalDigitNumber;
  if ((int) c >= 48)
    return (int) c <= 57;
  else
    return false;
}
...