【发布时间】:2011-07-22 19:57:52
【问题描述】:
我正在尝试编写转换类型的通用方法。我想写类似Cast.To<Type>(variable) 而不是(Type) variable。
我这个方法的错误版本:
public class Cast
{
public static T To<T>(object o)
{
return (T) o;
}
}
这是一个简单的测试:
public class A
{
public static explicit operator B(A a)
{
return new B();
}
}
public class B
{
}
A a = new A();
B b = Cast.To<B>(a);
如您所料,此代码将失败并显示InvalidCastException。
此代码是否失败是因为虚拟机不知道如何在运行时将object 类型的变量转换为B 类型?但是异常消息说:“无法将 A 类型的对象转换为 B 类型”。所以 CLR 知道变量o 的真实类型,为什么它不能执行转换?
这里是主要问题:我应该如何重写方法T To<T>(object o) 来解决这个问题?
【问题讨论】:
-
我不太喜欢“将 anything 转换为 T”的想法。我想我对 C# 的了解还不够。
-
这是我的主要问题:为什么?
Cast.To<B>(...)比(B)...更容易使用在什么方面? -
@StriplingWarrior:JeffN825 解释 - 方法使流畅的界面风格调用成为可能。我自己看不出其他原因......
-
@StriplingWarrior,请不要误解这个问题,我不是要替换传统的类型转换,我想了解 CLR 的工作原理以及如何解决所描述的问题。
-
@shidzo:啊,如果只是为了更好地理解 CLR,我可以理解。
标签: c# .net generics casting types