c# - 为什么不能将泛型约束强制转换为其派生类型?

标签 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; } }
}

你猜怎么着,这个方法会返回一个编译错误:

    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/

相关文章:

c# - 在 WP8 应用程序关闭后使用 BackgroundUploadAsync 将文件上传到 SkyDrive

c# - 安排 Web Api 方法按设定的时间间隔运行

java - 不安全操作、未经检查的转换

java - 新的 ArrayList<int>() 在 Java 中失败

java - 如何创建具有两个泛型的 java 类?

c# - 如何将 JSON 数据发布到 MVC 4 Controller ?

c# - 密集分布式 C# (WCF) 架构设计

c# - 将 DB Connection 对象传递给方法

java - 在泛型类中使用泛型对象方法

java - GSON 反序列化泛型类型