C#中的泛型和继承

Ras*_*sto 4 c# generics inheritance entity-framework

我有ER设计师生成的实体类,我修改了一下.这是声明:

public abstract partial class Preference<T> : EntityObject, IPreference<T>
Run Code Online (Sandbox Code Playgroud)

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

public partial class BoolPref : Preference<bool>
Run Code Online (Sandbox Code Playgroud)

所以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;
Run Code Online (Sandbox Code Playgroud)

当我尝试将新的BoolPref添加到此ObjectSet时,如下所示

context.Preferences.AddObject(new BoolPref ());
Run Code Online (Sandbox Code Playgroud)

我得到编译时错误.

如何将BoolPref的实例添加到Preferences?mystake在哪里?

Eri*_*ert 13

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

var set = new ObjectSet<Preference<object>>();
set.Add(new Preference<bool>());
set.First().Value = "hello"; 
Run Code Online (Sandbox Code Playgroud)

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

这就是为什么这不合法.在C#4中,只有在可证明类型安全的情况下,并且仅当泛型类型是接口或委托时,并且仅当变量类型参数是引用类型时,才能具有通用协方差和逆变.