Boolean, Char, DateTime, String и Object TypeConverter наследуют от BaseTypeConverter и не перезаписывают CanConvertTo, которые возвращают true, только если переданный тип имеет строку типа. Вот почему TypeDescriptor.GetConverter(typeof(bool)).CanConvertTo(typeof(bool))
ложно.
Преобразователи типа для байтов, двоичных, Int16, Int32, Int64, SByte, Single, UInt16, UInt32 и UInt64 являются производными от BaseNumberConverter, который возвращает true для CanCovertTo для типов, которые являются строками или примитивными типами.
Десятичный код также наследуется от BaseNumberConverter, но поскольку он не является примитивным, он передает тип decimail в CanConvertTo, что приведет к ложному. Вот почему TypeDescriptor.GetConverter(typeof(decimal)).CanConvertTo(typeof(decimal))
неверно.
Вот полный график для результатов CanConvertTo
FROM/TO Bol Byt Chr DTm Dec Dbl I16 I32 I64 SBt Sng Str Obj U16 U32 U64
Boolean +
Byte + + + + + + + + + + + + +
Char +
DateTime +
Decimal + + + + + + + + + + + + +
Double + + + + + + + + + + + + +
Int16 + + + + + + + + + + + + +
Int32 + + + + + + + + + + + + +
Int64 + + + + + + + + + + + + +
SByte + + + + + + + + + + + + +
Single + + + + + + + + + + + + +
String +
Object +
UInt16 + + + + + + + + + + + + +
UInt32 + + + + + + + + + + + + +
UInt64 + + + + + + + + + + + + +
Типы и их преобразователи
Type Converter class Converter inherits from
---------- ------------------ -----------------------
Boolean BooleanConverter TypeConverter
Byte ByteConverter BaseNumberConverter
Char CharConverter TypeConverter
DateTime DateTimeConverter TypeConverter
Decimal DecimalConverter BaseNumberConverter
Double DoubleConverter BaseNumberConverter
Int16 Int16Converter BaseNumberConverter
Int32 Int32Converter BaseNumberConverter
Int64 Int64Converter BaseNumberConverter
SByte SByteConverter BaseNumberConverter
Single SingleConverter BaseNumberConverter
String StringConverter TypeConverter
Object TypeConverter Object
UInt16 UInt16Converter BaseNumberConverter
UInt32 UInt32Converter BaseNumberConverter
UInt64 UInt64Converter BaseNumberConverter
UInt32 UInt32Converter BaseNumberConverter
UInt64 UInt64Converter BaseNumberConverter
Я не уверен, если кто-нибудь, кроме члена BCL команды, действительно может объяснить если бы была настоящая причина этого, или это был просто надзор. Я вижу логику в [BaseNumberConverter.CanConvertTo] (http://referencesource.microsoft.com/System/R/0ca895b4d1e6191c.html), которая проверяет примитивные типы, которые Десятичные * не *, объясняя тем самым расхождение с Decimal. Но почему бы не поддержать десятичное? –