发现泛型约束不能被衍生到它的衍生类型是非常令人费解的.
假设我有以下代码:
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; } }
}
Run Code Online (Sandbox Code Playgroud)
猜猜看,这个方法会返回一个编译错误:
public void FreeConversion<T>(T baseClass)
{
if(baseClass.GetType()==typeof(DeriveClass)
var derivedMe = (DeriveClass)baseClass;
}
Run Code Online (Sandbox Code Playgroud)
我会投的baseClass,以object第一次之前,我可以投它DerivedClass,也就是说,
public void FreeConversion<T>(T baseClass)
{
if(baseClass.GetType()==typeof(DeriveClass)
var derivedMe = (DeriveClass)((object)baseClass);
}
Run Code Online (Sandbox Code Playgroud)
对我来说很难看.为什么会这样?
小智 7
首先,您不应该将基类型变量强制转换为派生类型.它不应该工作,只是反过来.
其次,为什么它通过object,是因为你删除了编译时类型检查.编译器可以检查是否BaseType无法转换为DerivedType.但是当变量出现时object,编译器会假设您知道自己在做什么.即使它会编译,代码也会在执行期间崩溃.
| 归档时间: |
|
| 查看次数: |
347 次 |
| 最近记录: |