TypeConverter 无法从某些基本类型转换为相同的基本类型
TypeConverter cannot convert from some base types to same base types
为什么那些 return true
:
TypeDescriptor.GetConverter(typeof(double)).CanConvertTo(typeof(double));
TypeDescriptor.GetConverter(typeof(int)).CanConvertTo(typeof(int));
当那些 return false
?
TypeDescriptor.GetConverter(typeof(decimal)).CanConvertTo(typeof(decimal));
TypeDescriptor.GetConverter(typeof(bool)).CanConvertTo(typeof(bool));
考虑到 GetConverter 编辑的所有转换器 return 应该只将类型与字符串相互转换:
我正在使用 .NET Framework 4.5.2。
DecimalConverter
(以及 DoubleConverter
和 Int32Converter
)覆盖 CanConvertTo
以指示它可以转换为字符串(因为那是 base.CanConvertTo
所做的) 和所有 CLR 基元类型。来自 the Reference Source:
public override bool CanConvertTo(ITypeDescriptorContext context, Type t)
{
if (base.CanConvertTo(context, t) || t.IsPrimitive) {
return true;
}
return false;
}
decimal
从 CLR 的角度来看不是原始类型,因此转换器 returns false
在传递 typeof(decimal)
.
时
BooleanConverter
不会覆盖 CanConvertTo
,因此它属于基本实现,它只允许转换为 string
:
public virtual bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
{
return (destinationType == typeof(string));
}
如果你问为什么它是这样设计的,那么只有框架设计者可以说,但我怀疑这是因为它是一个简单的检查,看看你是否在尝试从一种类型转换为相同类型。
考虑到它们的目的是转换非字符串类型 to/from 字符串以显示在 属性 网格、XAML 等中,所以它没有完全显示也就不足为奇了支持非字符串转换。
Boolean
、Char
、DateTime
、String
和 Object
的 TypeConverter
继承自 BaseTypeConverter
而不是't overwrite CanConvertTo
,return 仅当传递的类型为 string
类型时才为真。这就是为什么 TypeDescriptor.GetConverter(typeof(bool)).CanConvertTo(typeof(bool))
是错误的。
Byte
、Double
、Int16
、Int32
、Int64
、SByte
、Single
的类型转换器、UInt16
、UInt32
和 UInt64
均派生自 BaseNumberConverter
,其中 return 对于 CanCovertTo
为字符串或基本类型的类型是正确的.
Decimal
也继承自 BaseNumberConverter
,但由于它不是基本类型,将小数类型传递给 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
为什么那些 return true
:
TypeDescriptor.GetConverter(typeof(double)).CanConvertTo(typeof(double));
TypeDescriptor.GetConverter(typeof(int)).CanConvertTo(typeof(int));
当那些 return false
?
TypeDescriptor.GetConverter(typeof(decimal)).CanConvertTo(typeof(decimal));
TypeDescriptor.GetConverter(typeof(bool)).CanConvertTo(typeof(bool));
考虑到 GetConverter 编辑的所有转换器 return 应该只将类型与字符串相互转换:
我正在使用 .NET Framework 4.5.2。
DecimalConverter
(以及 DoubleConverter
和 Int32Converter
)覆盖 CanConvertTo
以指示它可以转换为字符串(因为那是 base.CanConvertTo
所做的) 和所有 CLR 基元类型。来自 the Reference Source:
public override bool CanConvertTo(ITypeDescriptorContext context, Type t)
{
if (base.CanConvertTo(context, t) || t.IsPrimitive) {
return true;
}
return false;
}
decimal
从 CLR 的角度来看不是原始类型,因此转换器 returns false
在传递 typeof(decimal)
.
BooleanConverter
不会覆盖 CanConvertTo
,因此它属于基本实现,它只允许转换为 string
:
public virtual bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
{
return (destinationType == typeof(string));
}
如果你问为什么它是这样设计的,那么只有框架设计者可以说,但我怀疑这是因为它是一个简单的检查,看看你是否在尝试从一种类型转换为相同类型。
考虑到它们的目的是转换非字符串类型 to/from 字符串以显示在 属性 网格、XAML 等中,所以它没有完全显示也就不足为奇了支持非字符串转换。
Boolean
、Char
、DateTime
、String
和 Object
的 TypeConverter
继承自 BaseTypeConverter
而不是't overwrite CanConvertTo
,return 仅当传递的类型为 string
类型时才为真。这就是为什么 TypeDescriptor.GetConverter(typeof(bool)).CanConvertTo(typeof(bool))
是错误的。
Byte
、Double
、Int16
、Int32
、Int64
、SByte
、Single
的类型转换器、UInt16
、UInt32
和 UInt64
均派生自 BaseNumberConverter
,其中 return 对于 CanCovertTo
为字符串或基本类型的类型是正确的.
Decimal
也继承自 BaseNumberConverter
,但由于它不是基本类型,将小数类型传递给 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