1

我有以下课程 -

public abstract class BusinessObject { }
public abstract class Form: BusinessObject { }
public abstract class BillableForm: Form { }
public class MembershipForm: BillableForm { }

public abstract class Dto<T>: where T: BusinessObject { }
public abstract class InboxDto<T>: Dto<T> where T: Form { }
public class MembershipFormDto: InboxDto<MembershipForm> { }

我有以下看法——

membershipform.cshtml:
@model AdminSite.Models.MembershipFormDto
@{
    Layout = "~/Views/Inbox/Shared/_LayoutForm.cshtml"
}

_LayoutForm.cshtml:
@model InboxDto<Form>

当我登陆 membersform.cshtml 页面时,我收到以下异常说明:

传入字典的模型项的类型为“AdminSite.Models.MembershipFormDto”,但该字典需要类型为“AdminSite.Infrastructure.Models.InboxDto`1[BusinessLogic.Inbox.Form]”的模型项。

从我所知道的一切来看,MembershipFormDtoIS-AInboxDto类型MembershipForm,其中MembershipFormIS-A Form。是什么赋予了?

4

1 回答 1

2

结果证明这是一个协方差问题。

我添加了以下界面 -

public interface IInboxDto<out T>

并修改了 InboxDto 类以实现该接口 -

public abstract class InboxDto<T>: Dto<T>, IInboxDto<T> where T: Form { }

简而言之,协方差正在从定义较多的类型变为定义较少的类型。专门用定义较少的引用引用定义较多的对象。编译器抱怨的原因是它阻止了这样的场景:

List<String> instanciatedList = new List<String>;
List<Object> referenceList = instanciatedList;
referenceList.add(DateTime);

最后一行是有道理的,一个DateTimeIS-A Object。我们已经说过是referenceList一个ListObject但是它被实例化为Listof String。A ListofObject比 a Listof更宽松String。突然间,我们的保证new List<String>被忽略了。

然而,定义的 out 和 in 关键字Interface告诉编译器放松,我们知道我们在做什么并理解我们正在做什么。

更多信息。

于 2012-10-07T23:14:10.920 回答