C#通用铸造异常

And*_*lon 6 .net c# generics casting

我在使用泛型时遇到了一个奇怪的转换问题.下面的代码将抛出一个InvalidCastException尽管明显int可以强制转换为a 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);
}
Run Code Online (Sandbox Code Playgroud)

编辑:

因为我在.net 4.0土地上无论如何我改变它使用'动态'而不是'对象',一切都按预期工作.欣赏所有现场和快速回复.

Cod*_*ray 9

但是一个人object不能投double.o参数需要一个object,而不是一个int.

例如,以下代码失败,其中包含InvalidCastException:

 object o = 1000;
 double x = (double)o;
Run Code Online (Sandbox Code Playgroud)

  • Nitpick:如果`object`是一个盒装的`double`,````*可以*被强制转换为`double`. (2认同)

Ste*_*cya 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));
            }
        }
Run Code Online (Sandbox Code Playgroud)