1

を指定すると、次のようなものList<T>を選択する関数があります。List<V>V : T

現在の実装は次のとおりです。

public List<V> Subset<T, V>(IEnumerable<T> exo)
    where V : class
    where V : T
{
    return exo.Where(elem => elem is V).Select(elem => elem as V).ToList();
}

Vのサブクラスであると述べられているため、より簡潔なものが機能するはずだと思いますがT

// Does not comile: can not implicitly convert List<T> to List<V>
public List<V> Subset<T, V>(IEnumerable<T> exo) where V : T
{
    return exo.Where(elem => elem is V).ToList();
}

正しい型を推測できない理由と、おそらく私の現在の実装が可能な限り最善であるかどうかを説明してください。

4

1 に答える 1

10

パラメータタイプに基づいてシーケンスをフィルタリングするEnumerable.OfTypeを使用できます。

return exo.OfType<V>().ToList();

2 番目のコードが機能しない理由 - シーケンスから V である項目を選択しますが、結果の型は依然として list ofTです。いくつかの述語によってフィルタリングされたシーケンス (そこでチェックしたものは関係ありません - タイプ V の項目であるか、項目が null でないか、またはその他の条件です)。何をチェックしたかはわかりますが、コンパイラは結果をフィルタリングされた基本クラス オブジェクトのシーケンスとして扱います。

また、派生オブジェクトのリストを返す必要があるメソッドから基本クラス オブジェクトのリストを返すことはできません。可能であれば、フィルタリングされていない基本クラスのリストを返すことができます。

于 2013-01-03T10:40:30.523 に答える