List<>
和 IEnumerable<>
之间是否有关联?
示例:
var type1 = typeof(List<>);
var type2 = typeof(IEnumerable<>);
//return false
type2.IsAssignableFrom(type1);
有没有办法检查两个开放类型之间的关系,或者这种关系只存在于封闭类型中?
List<>
和IEnumerable<>
不是类型,它们是类型定义。因此,询问一个是否可分配给另一个并没有实际意义。它们都不能被赋值。例如,你不能声明一个变量List<> a = null
,否则会得到编译错误“意外使用未绑定的泛型名称。”
当你指定类型参数时,类型定义成为一个泛型类型。此时,它是一种类型,可以被分配。例如,List<string>
可以分配给IEnumerable<string>
。
如果您有一个类型定义在脑海中,并且想要进行类型兼容性检查,只需使用<object>
(或适当的类型,如果有类型约束)代替<>
:
var type1 = typeof(List<object>);
var type2 = typeof(IEnumerable<object>);
//returns true
type2.IsAssignableFrom(type1);
type2.IsAssignableFrom(type1)
的行为。但是,您是否意味着两个开放式泛型类型在成为封闭类型或有界类型之前是独立的或没有关系? - YonFList<>
是否实现了IEnumerable<>
并没有太多意义,因为它本来就没有实现。 - John WuList<>
始终都是一个IEnumerable<>
,正如您可以在List<T>
类型的定义中看到的那样。但这并没有回答您的第二个问题,即是否有方法可以检查两个类型之间是否存在这样的关系。您可能会认为IsAssignableFrom
方法可以用于检查类型之间的关系是否存在,但你不能。为什么?让我们在IsAssignableFrom
函数的文档中找到答案。unknown != unknown
)。List<> 实现了封闭的 IEnumerable<T> 类型,而不是开放的 IEnumerable<> 类型 (3)。它们不是泛型类型参数 (4)。public static bool IsAssignableToOpenGenericType(Type givenType, Type genericType)
{
var interfaceTypes = givenType.GetInterfaces();
foreach (var it in interfaceTypes)
{
if (it.IsGenericType && it.GetGenericTypeDefinition() == genericType)
return true;
}
if (givenType.IsGenericType && givenType.GetGenericTypeDefinition() == genericType)
return true;
Type baseType = givenType.BaseType;
if (baseType == null) return false;
return IsAssignableToGenericType(baseType, genericType);
}
将产生以下结果:
var typ1 = typeof(List<>);
var typ2 = typeof(IEnumerable<>);
// true, List<>'s type definition contains an IEnumerable<>
Console.WriteLine(IsAssignableToOpenGenericType(typ1, typ2));
// false, IEnumerable<>'s type definition does not contain List<>
Console.WriteLine(IsAssignableToOpenGenericType(typ2, typ1));
List<T(from List<T>)>
实现了IEnumerable<T(from List<T>)>
但不实现IEnumerable<T(from IEnumerable<T>)>
。 - user4003407Expression<Func<IEnumerable<Typea>, Typea, bool>> expression1 = (values, value) => values.Contains(value);
转换为Expression<Func<IEnumerable<Typeb>, bool>>
,其中TypeA
和TypeB
是独立的。我需要将expression1
中的values
常量转换为一个新类型的IEnumerable<Typeb>
,因此我创建了一个List<Typeb>
实例来表示IEnumerable<Typeb>
,原始表达式集合可以是任何其他泛型接口。我想检查这些值是否可以分配给List<>
。我对开放类型关系很感兴趣。 - YonF