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中,只有在可证明类型安全的情况下,并且仅当泛型类型是接口或委托时,并且仅当变量类型参数是引用类型时,才能具有通用协方差和逆变.