考虑这个简单的代码:
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);
}
我想将两个列表合并为一行,并在编译时保持类型安全。
例如,如果我删除了 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>
.
有什么办法可以做到这一点?