次の簡単なコードを検討してください。
public interface Iinterface { }
public class Foo : Iinterface { }
public class Bar : Iinterface { }
[TestMethod()]
public void Test_Concat()
{
var bars = new List<Bar>();
var foos = new List<Foo>();
// Ok
IEnumerable<Iinterface> concats1 = bars.Cast<Iinterface>().Concat(foos.Cast<Iinterface>());
// Compilation error
IEnumerable<Iinterface> concats2 = bars.Concat(foos);
}
2 つのリストを 1 行に 1 つに連結し、コンパイル時にタイプ セーフを維持したい。
たとえば、 class のインターフェイスを削除した場合Foo
、これはコンパイルされますが、実行時に失敗します。
public interface Iinterface { }
public class Foo { }
public class Bar : Iinterface { }
[TestMethod()]
public void Test_Concat()
{
var bars = new List<Bar>();
var foos = new List<Foo>();
IEnumerable<Iinterface> concats1 = bars.Cast<Iinterface>().Concat(foos.Cast<Iinterface>());
}
を使用するOfType<T>()
と、実行時に失敗することはありませんが、コンパイル時に失敗するようにします。私が見つけた最善の方法は、次の 3 行のコードを使用することです。
var list = new List<Iinterface>();
list.AddRange(bars);
list.AddRange(foos);
しかし、そのような単純なものについては、ワンライナーを見つけて、可能であれば のIEnumerable<Iinterface>
代わりに を取得したいと考えていますList<Iinterface>
。
これを達成する方法はありますか?