c# - 使用构造的返回类型覆盖通用基类属性

标签 c# oop unity3d generics

我想在 Unity 编辑器中使用通用类型定义,但(尚)无法更新到 native 支持此功能的 Unity 2020.1。解决方法是定义一个扩展泛型类的非泛型类。
但是,当我尝试使用基本上是泛型属性的命名版本的已定义类覆盖基类属性时,编译器报告两种类型不兼容。由于此描述非常......通用......这里有一些代码来说明我的问题:

class Property<T> { }

class BaseClass<T>
{
    public virtual Property<T> Property { protected get; set; }
}

class StringProperty : Property<string> { }

class SubClass : BaseClass<string>
{
    public override StringProperty Property { protected get; set; }
}

SubClass.Property': type must be 'Property<string>' to match overridden member 'BaseClass<string>.Property
SubClass.Property 基本上是 Property<string>但我不知道如何将其传达给编译器。

最佳答案

问题是,虽然每个 StringPropertyProperty<string> , 不是每个 Property<string>StringProperty .听起来怪怪的?所以我们开始了。
想象一下你类的一个客户有这个:

BaseClass<string> b = new SubClass();
现在人们会假设我们可以这样做:
b.Property = new MyProperty();
哪里MyProperty也源自 Property<string> .然而,这与您对 SubClass 实例的期望相矛盾。有一个 StringProperty ,不是 MyProperty .
这与泛型无关。简而言之,您不能通过覆盖来更改成员的签名。基类成员和派生类成员都必须具有完全相同的签名,包括返回类型。

关于c# - 使用构造的返回类型覆盖通用基类属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63706043/

相关文章:

c# - 如何在控件之间添加动态间距? (附图片)

c# - 结帐流程工作流程,存在重定向问题

c# - 测试类可以有属性吗?

javascript - 是否可以调用像数组索引这样的 TypeScript 方法?

c# - 如何在 C# 中对泛型类型指定多个约束?

c# - Unity3d 霰弹枪锥形射击

c# - 统一重生时重新启动计时器

c# - NHibernate 映射索引超出范围

c# - 根据 WPF Treeview 中的枚举绑定(bind)图标

unity3d - 向 TextMeshPro 文本添加轮廓