Подтвердить что ты не робот

Почему IsAssignableFrom() не работает для int и double?

Это неверно: typeof(double).IsAssignableFrom(typeof(int))

Это неверно: typeof(int).IsAssignableFrom(typeof(double))

Но это работает:

        double a = 1.0;
        int b = 1;

        a = b;

Ясно, что double назначается из int, но фреймворк IsAssignableFrom() ошибочно.

Почему? или это ошибка в .NET, вызванная особым характером int и double, которые не имеют отношения наследования, но могут быть назначены (в одном направлении)?

4b9b3361

Ответ 1

С# обеспечивает неявное преобразование от int до double. Это языковое решение, а не то, что .NET сделает для вас... поэтому с точки зрения .NET double не может быть назначено из int.

(В качестве примера того, почему это зависит от языка, F # не выполняет неявные преобразования для вас так: вам нужно явно указать преобразование.)

Стоит посмотреть документацию для Type.IsAssignableFrom (очень легко отредактирован для чтения):

Возвращает true, если c и текущий тип представляют один и тот же тип, или если текущий тип находится в иерархии наследования c, или если текущий тип является интерфейсом, который c реализует, или если c является параметром общего типа и текущий тип представляет одно из ограничений c. Возвращает false, если ни одно из этих условий не является истинным, или если c имеет значение null.

Теперь примените это к double и int, и вы увидите, что он должен возвращать false.