C#通用铸造异常

时间:2011-03-16 12:01:23

标签: c# .net casting generics

我在使用泛型时遇到了一个奇怪的转换问题。以下代码将抛出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',一切都按预期工作。感谢所有现场和快速回复。

7 个答案:

答案 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对象不知道给定类型是否具有此转换,因此它会尝试基本强制转换并失败。