私は、DTOのリストからselectを呼び出すことによって、DTOからViewModelsのリストを作成しようとしています。メソッドのコンパイラがこの選択呼び出しの型を推論できないのはなぜですか?
型引数は、使用状況から推測することはできません
私の質問は、なぜそれできない、ある型引数を指定してみてください: はしかし、コンパイラは私に言ってエラーになりますか? TextSectionDTO
とImageSectionDTO
の両方はSectionDTO
に由来します。 List
をSections
に作成しようとしており、TextSection
とImageSection
の両方がSection
に由来しています。
私はこの質問がここに掲載されている他の質問に近いことは知っていますが、回答が見つかりませんでした。
これは私のコードです:
私は唯一のスーパーSectionDTOを受け入れ、唯一のセクション(私はそれらをこのシナリオでは、通常のクラスの両方にする)あなたのような選択な作品と思いを返すように、私は種類を変更private List<Section> BuildSectionViewModel(IEnumerable<SectionDTO> ss)
{
var viewModels = ss.Select((SectionDTO s) =>
{
switch (s.SectionType)
{
case Enums.SectionTypes.OnlyText:
return new TextSection((TextSectionDTO) s);
case Enums.SectionTypes.OnlyImage:
return new ImageSection((ImageSectionDTO) s);
default:
throw new Exception("This section does not exist - FIXME");
}
}).ToList();
return viewModels;
}
期待する。次に、タイプをTextSectionDTOとTextSectionだけに変更して(アブストラクトを元に戻す)、選択はもう機能しません。
これは私が今のところ建設しているものと同じように働くことができるように解決策を望んでいますが、なぜこれがそのように機能しないのかにもっと興味があります。これを動作させることができても、おそらくこれを後でリファクタリングします。
注:
- 私はMVC 4.5をターゲットにしています(そのため、コンパイラは、ここにいくつかの類似した質問への解決策だった、推測することができないいくつかの古いバージョンではありません)。
- switch節にはデフォルトの大文字と小文字の区別があります。つまり、値を返さないパスによってエラーが発生しないようにする必要があります。
を解決する必要があります。なぜ私はこれを行う必要がありますか?彼らは両方のセクションから派生しているという事実は、私は式がである方法のセクション一覧を返していたという事実与え十分ではありませんか。 – Glubus
私は、コンパイラが全体の継承チェーンをチェックするならば、これは全体のチェーンに複数のループがかかる場合がありますので、これはあると仮定します。あなたがもっと深い鎖を持っていると仮定してください。コンパイラは、チェーン全体で言及されているすべてのインタフェースとベースクラスに対して、時間がかかりすぎるかどうかをチェックする必要があります。 – HimBromBeere
これらは両方とも 'object'から継承します。 '新しい[] {A、B、C}': –