我有这样的方法:
public static T To<T>(this char o)
where T : struct
{
return (T)Convert.ChangeType(o, typeof(T));
}
如果我代替 T 是双精度(或浮点数),那么它会发出InvalidCastException类似System.InvalidCastException: Недопустимое приведение "Char" к "Double".
Well, what's wrong with double 的文本?类型明显大于char。现在这个方法看起来像这样:
public static T To<T>(this char o)
where T : struct
{
var obj = Convert.ChangeType(o, typeof(int));
return (T)Convert.ChangeType(obj, typeof(T));
}
问题本身就在标题中。这是否以某种方式在逻辑上进行了解释?我没有找到答案。
该方法在
Convert.ChangeType内部尝试将参数转换为IConvertible并调用适当的方法。对于带有 的情况
Char,将调用其方法.ToDouble其中显式抛出异常。
为什么
.ToDouble不支持该方法?不仅是这种方法。
.ToBoolean,.ToDateTime,.ToDecimal并且.ToSingle也不支持,它们都抛出InvalidCastException与.ToDouble.在这种情况下,.NET 设计试图让您远离麻烦。转换
char为整数类型是有意义的,您可以查看 Unicode 表并计算codepoint. 但是应该转换成Boolean什么?Unicode code point会是哪一个True?一个字符怎么可能是一个小数值?没有一半或四分之一codepoint。@HansPassant答案的翻译
还值得注意的是,类型
char可以隐式转换为 typeushort,int,uint,long,ulong,float,doubleordecimal。也就是说,以下代码可以正常工作: