我有两个IEnumerable不同类型的 s,它们都派生自一个公共基类。现在我尝试联合枚举来获得基类的枚举。我必须明确地将其中一个枚举类型转换为基类才能使其正常工作。
我猜想编译器会自动为生成的可枚举选择最接近的通用基本类型,但事实并非如此。
这是该行为的一个示例:
namespace ConsoleApp1
{
public class BaseClass { }
public class DerivedClass1 : BaseClass { }
public class DerivedClass2 : BaseClass { }
class Program
{
static void Main(string[] args)
{
List<DerivedClass1> list1 = new List<DerivedClass1>();
List<DerivedClass2> list2 = new List<DerivedClass2>();
var a = list1.Union(list2); // Compiler Error
IEnumerable<BaseClass> b = list1.Union(list2); // Compiler Error
var c = list1.Cast<BaseClass>().Union(list2); // This works
var d = list1.Union(list2.Cast<BaseClass>()); // This works
var e = list1.Cast<BaseClass>().Union(list2.Cast<BaseClass>()); // This works, but ReSharper wants to remove one of the casts
}
}
}
var c似乎很容易解释,因为第一个 enumerable 现在是 type BaseClass,所以与第二个列表的联合,其中包含从 BaseClass 派生的元素也很容易理解。
var d对我来说不是那么容易理解,因为我们从一个可枚举的元素开始DerivedClass1并将其与BaseClass元素联合。我很惊讶这行得通。是因为联合操作是一种交换操作,所以它必须像c也一样有效吗?
江户川乱折腾
慕姐4208626
Qyouu
相关分类