为什么泛型约束不能被衍生出来?

Gra*_*ton 8 c# generics

发现泛型约束不能被衍生到它的衍生类型是非常令人费解的.

假设我有以下代码:

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,编译器会假设您知道自己在做什么.即使它会编译,代码也会在执行期间崩溃.