gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:02:14 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com