Warum gibt Char.IsDigit true für Zeichen zurück, die nicht in int analysiert werden können?

Ich benutze oftChar.IsDigit um zu überprüfen, ob achar ist eine Ziffer, die besonders bei LINQ-Abfragen zur Vorabprüfung nützlich istint.Parse wie hier:"123".All(Char.IsDigit).

Aber es gibt Zeichen, die Ziffern sind, aber nicht analysiert werden könnenint mögen۵.

// true
bool isDigit = Char.IsDigit('۵'); 

var cultures = CultureInfo.GetCultures(CultureTypes.SpecificCultures);
int num;
// false
bool isIntForAnyCulture = cultures
    .Any(c => int.TryParse('۵'.ToString(), NumberStyles.Any, c, out num)); 

Warum ist das so? Ist meinint.Parse-ÜberprüfenChar.IsDigit also falsch?

Es gibt 310 Zeichen, die Ziffern sind:

List<char> digitList = Enumerable.Range(0, UInt16.MaxValue)
   .Select(i => Convert.ToChar(i))
   .Where(c => Char.IsDigit(c))
   .ToList(); 

Hier ist die Implementierung vonChar.IsDigit in .NET 4 (ILSpy):

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

Also, warum gibt es Zeichen, die zu den gehören?DecimalDigitNumber-Kategorie("Dezimalziffer, dh ein Zeichen im Bereich von 0 bis 9 ..."), die nicht zu einemint in irgendeiner Kultur?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage