gpt4 book ai didi

c# - 为什么通用类型定义实现的接口(interface)会丢失类型信息?

转载 作者:太空狗 更新时间:2023-10-29 17:49:16 27 4
gpt4 key购买 nike

例如,如果您运行以下代码...

Type IListType = new List<string>().GetType()
.GetInterface("IList`1")
.GetGenericTypeDefinition();

...然后观察 IListType 变量,您会发现整个 Type 实例具有所有可用的属性,如 FullName 和其他.

但是当您运行下面的代码时会发生什么?

Type IListType2 = typeof(List<>).GetInterface("IList`1")

现在 IListType 从泛型类型定义中得到的与第一个代码示例不同:大多数 Type 属性将返回 null。

主要问题是 IListType == IListType2 不相等,但它们是同一类型。

这是怎么回事?

这很丑...

现在看看如果调用 IListType2.GetGenericTypeDefinition() 会发生什么……它恢复了类型信息!

如果 .NET Framework 开发团队成员可以向我们解释为什么已经奇怪地丢失了元数据的泛型类型定义将 IsGenericTypeDefinition 属性设置为 false,但它仍然是泛型类型定义,最后,如果您对其调用 GetGenericTypeDefinition(),您将恢复类型信息。

这很奇怪...

以下等式将为:

Type IListType = new List<string>().GetType()
.GetInterface("IList`1")
.GetGenericTypeDefinition();

// Got interface is "like a generic type definition" since it has
// no type for T generic parameter, and once you call
// GetGenericTypeDefinition() again, it recovers the lost metadata
// and the resulting generic type definition equals the one got from
// List<string>!
Type IListType2 = typeof(List<>).GetInterface("IList`1").GetGenericTypeDefinition();

bool y = IListType == IListType2;

最佳答案

以下类型都是不同的,没有继承关系:

  • IList<T>
  • IList<int>
  • IList<string>

所有这些都有不同的Type对象,因为你可以用它们做不同的事情。后两者是前者的特化。第一个是泛型​​类型定义(您可以通过 GetGenericTypeDefinition 获得)。

还有另一部分要解释。当你说 class List<T> : IList<T>然后是 IList<T>部分等于typeof(IList<>)因为它已经专门用于 T .这不再是泛型类型定义。它是一个具体类型,例如 IList<int> .它专门将其唯一的类型参数绑定(bind)到 TList<T>专门用于。


LINQPad 实验:

Type bound = new List<string>().GetType().GetInterface("IList`1");
bound.GenericTypeArguments.Single().Dump(); //string


Type bound = typeof(List<>).GetInterface("IList`1");
bound.GenericTypeArguments.Single().Dump(); //"T"
(bound.GenericTypeArguments.Single() == typeof(List<>).GetGenericArguments().Single()).Dump(); //true

关于c# - 为什么通用类型定义实现的接口(interface)会丢失类型信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33776433/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com