c# - C# 中的泛型和继承

标签 c# entity-framework generics inheritance

我对 E-R 设计器生成的实体类进行了一些修改。这是声明:

public abstract partial class Preference<T> : EntityObject, IPreference<T>

然后还有一个实体类声明如下:

public partial class BoolPref : Preference<bool>

所以 BoolPref继承自 Preferences<bool> . 现在我有了这个生成的属性:

public ObjectSet<Preference<object>> Preferences
    {
        get
        {
            if ((_Preferences == null))
            {
                _Preferences = base.CreateObjectSet<Preference<object>>("Preferences");
            }
            return _Preferences;
        }
    }
    private ObjectSet<Preference<object>> _Preferences;

当我尝试按如下方式向此 ObjectSet 添加新的 BoolPref 时

context.Preferences.AddObject(new BoolPref ());

我遇到编译时错误。

如何将 BoolPref 的实例添加到首选项中? mystake 在哪里?

最佳答案

假设 Preference<T>有一个名为 T 类型值的读写属性。现在假设类型系统按照您希望的方式工作:

var set = new ObjectSet<Preference<object>>();
set.Add(new Preference<bool>());
set.First().Value = "hello"; 

这在编译时是合法的,因为 set.First().Value 具有编译时对象类型,而不是 bool。但在运行时它是 bool 类型,你只是调用了一个接受 bool 并传递一个字符串的 setter,这破坏了 CLR 中的内存,然后崩溃并可怕地死掉。

这就是为什么这是不合法的。在 C# 4 中,只有当泛型类型安全且泛型类型是接口(interface)或委托(delegate),并且可变类型参数是引用类型时,您才能拥有泛型协变和逆变。

关于c# - C# 中的泛型和继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3526050/

相关文章:

c# - 缺少类型 Microsoft.CSharp.RuntimeBinder.Binder

c# - 检索 SQL DATETIME 并将其放入变量

c# - 删除时如何从集合中删除实体

泛型类的 Java 工厂

c# - 如何将创建的用户声明传递给客户端

sql - 在 View 中使用时是否可以使不可为空的列可以为空? (SQL服务器)

c# - Entity Framework - 使用具有不同连接字符串的相同 DbContext

c# - ASP.NET 样板中的 DeleteRange 函数

java - 为什么不能用Java声明Monad接口(interface)?

Java泛型数组操作