我在使用泛型时遇到了一个奇怪的转换问题。以下代码将抛出InvalidCastException
,即使int
显然可以转换为double
。任何人都可以解释这种行为以及如何绕过它吗?
public class TestClass<T>
{
public T Cast(object o)
{
return (T)o;
}
}
public void Main()
{
TestClass<double> w = new TestClass<double>();
double x = w.Cast(10);
}
修改
因为我在.net 4.0土地上无论如何我已经改变它使用'dynamic'而不是'object',一切都按预期工作。感谢所有现场和快速回复。
答案 0 :(得分:9)
但object
无法转换为double
。 o
参数需要object
,而不是{{1} }}
例如,以下代码失败并显示int
:
InvalidCastException
答案 1 :(得分:6)
您可以使用TypeConverter转换变量
public class TestClass<T>
{
public T Cast(object o)
{
TypeConverter converter = TypeDescriptor.GetConverter(o);
if (converter.CanConvertTo(typeof(T)))
{
var result = converter.ConvertTo(o, typeof(T));
return (T)result;
}
throw new InvalidCastException(
string.Format("Cannot convert from {0} to {1}", o.GetType().Name, typeof(T).Name));
}
}
答案 2 :(得分:1)
Cast中的参数“o”已装箱。显然,你不能将盒装int强制转换为未装箱的双精度型。请参阅here。
如果您知道它是Cast函数中的int,您可以这样做:
return (double)((int)o);
我不知道未知类型的情况。检查。
编辑:将T改为双
答案 3 :(得分:1)
这样可行
object y = 10;
Double v = (int) y;
这不会
object y = 10;
Double v = y;
因为必须明确表示。
答案 4 :(得分:0)
您可以通过执行以下操作来绕过它:
public class TestClass<T>
{
public T Cast<T2>(T2 o)
{
return (T)o;
}
}
应该希望(没有机会在这里测试)推断你正在使用int并允许这种情况。虽然它不会阻止你把其他无法正确投射的东西。
答案 5 :(得分:0)
public T Cast(object o)
{
return (T)Convert.ChangeType(o, typeof (T));
}
我不确定为什么。
答案 6 :(得分:-1)
我猜这是因为int不能 casated 到double,但是有一个显式转换到double。必须在类型上定义。由于您的Cast对象不知道给定类型是否具有此转换,因此它会尝试基本强制转换并失败。