我对 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/