鉴于此代码:
public interface ITagModel { }
public interface ITemplate {
ITagModel Model { get; set; }
}
public class EmailTag : ITagModel { }
public class EmailTest : ITemplate {
public EmailTag Model { get; set; }
}
我被告知EmailTag
的类型(EmailClass
内)无法实现属性Model
,因为它不是ITagModel
类型。
它继承了ITagModel ....所以为什么这不起作用?我能做些什么来完成我正在寻找的东西?
答案 0 :(得分:5)
C#不支持covariant return。
e.g。
public class Base { }
public class Derived : Base { }
public class Component
{
public virtual Base GetComponent()
{
return new Base();
}
}
public class DerviedComponent : Component
{
public override Dervied GetComponent()
{
return new Derived();
}
}
因此,您需要抽象返回类型并将其约束到您的界面。这样任何实现都需要提供ITagModel
。
public interface ITagModel { }
public interface ITemplate<TModel>
where TModel : ITagModel
{
TModel Model { get; set; }
}
public class EmailTag : ITagModel { }
public class EmailTest : ITemplate<EmailTag> {
public EmailTag Model { get; set; }
}
答案 1 :(得分:2)
听起来你的ITemplate
界面应该是通用的:
public interface ITemplate<TModel> where TModel : ITagModel
{
TModel Model { get; set; }
}
然后:
public class EmailTest : ITemplate<EmailTag>
{
public EmailTag Model { get; set; }
}
想象一下,如果您当前的代码有效。然后我可以写:
ITemplate template = new EmailTest();
template.Model = new SomeOtherModel();
......你不会想那样的。 (基本上,你违反了类型安全。)