1

鉴于此代码:

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 .... 那么为什么这不起作用呢?我能做些什么来完成我正在寻找的东西?

4

2 回答 2

5

C# 不支持协变 return

例如

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; }
}
于 2013-06-24T16:34:30.490 回答
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();

......你不会想要那个。(基本上,你会违反类型安全。)

于 2013-06-24T16:35:27.673 回答