发现无法将泛型约束强制转换为其派生类型是一件非常令人费解的事情。
假设我有以下代码:
public abstract class BaseClass
{
public int Version
{ get { return 1; } }
public string FixString { get; set; }
public BaseClass()
{
FixString = "hello";
}
public virtual int GetBaseVersion()
{
return Version;
}
}
public class DeriveClass: BaseClass
{
public new int Version
{ get { return 2; } }
}
你猜怎么着,这个方法会返回一个编译错误:
public void FreeConversion<T>(T baseClass)
{
if(baseClass.GetType()==typeof(DeriveClass)
var derivedMe = (DeriveClass)baseClass;
}
我必须先将 baseClass
转换为 object
,然后才能将其转换为 DerivedClass
,即
public void FreeConversion<T>(T baseClass)
{
if(baseClass.GetType()==typeof(DeriveClass)
var derivedMe = (DeriveClass)((object)baseClass);
}
在我看来很丑陋。为什么会这样?
最佳答案
首先,您不应该将基类型变量转换为派生类型。它不应该工作,只有相反的方式。
其次,为什么它通过 object
工作,是因为您删除了编译时类型检查。编译器可以检查 BaseType
不能转换为 DerivedType
。但是当变量是object
时,编译器会假设您知道自己在做什么。即使可以编译,代码也会在执行过程中崩溃。
关于c# - 为什么不能将泛型约束强制转换为其派生类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2847285/