我想在 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>
但我不知道如何将其传达给编译器。
最佳答案
问题是,虽然每个 StringProperty
是 Property<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/