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>

Membershipform.cshtml ページにアクセスすると、次の例外が表示されます。

ディクショナリに渡されたモデル アイテムのタイプは「AdminSite.Models.MembershipFormDto」ですが、このディクショナリにはタイプ「AdminSite.Infrastructure.Models.InboxDto`1[BusinessLogic.Inbox.Form]」のモデル アイテムが必要です。

私が知る限り、 type のMembershipFormDtoIS-A 、IS-A . 何を与える?InboxDtoMembershipFormMembershipFormForm

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-AObjectです。referenceListは のListであると述べましたObject。ただし、Listofとしてインスタンス化されStringます。Listofは ofよりObjectも寛容ListですString。突然、私たちの保証new List<String>が無視されています。

ただし、Interface定義の out キーワードと in キーワードは、コンパイラにリラックスするように指示します。私たちは自分が何をしているのかを知っており、自分が何をしているのかを理解しています。

詳しくは。

于 2012-10-07T23:14:10.920 に答える