【问题标题】:Where are the array types? [duplicate]数组类型在哪里? [复制]
【发布时间】:2013-07-29 19:24:35
【问题描述】:

如果我们要制作特定类型的数组类型,使用MakeArrayType()是没有问题的,例如char数组:

typeof(char).MakeArrayType()

当然使用typeof(char[]) 更直观。

类型的属性Assembly 告诉我们该类型在哪里的程序集。

所以下面的代码应该是在程序集中查找类型的合理示例:

var chars=new[] { '\x20' };
var typeofCharArray=chars.GetType();
var assembly=typeofCharArray.Assembly;
var doesContain=assembly.GetTypes().Contains(typeofCharArray);

但是doesContain 说它不是,它是false。无论数组类型来自MakeArrayType()typeof(),还是实例的GetType,都会发生这种情况。

怀疑它被转发到我从Assembly.GetTypes 阅读的其他程序集。我试过了:

var assemblyContainsTypeOfCharArray=(
        from it in AppDomain.CurrentDomain.GetAssemblies()
        let types=it.GetTypes()
        where types.Contains(typeof(char[]))
        select it).FirstOrDefault();

有趣的是assemblyContainsTypeOfCharArraynull

数组类型在哪里?

【问题讨论】:

    标签: c# clr .net-assembly jit


    【解决方案1】:

    简单地说:GetTypes() 返回在该程序集中实际声明的类型。数组类型是...不是。他们声称来自那里,但这只是返回元素类型的Assembly 信息。数组类型实际上 声明在那里(它实际上并没有在任何地方声明 - 它是JIT的发明,on-飞)。

    所以基本上:数组类型谎言。丢人现眼。

    【讨论】:

    • abstract 类型 System.Array 属于 mscorlib.dll。显然GetType() 将返回一个具体类型。 System.Uri 类型在 System.dll 中定义。有谁知道typeof(Uri[]).Assembly 返回什么?
    • @JeppeStigNielsen 它将返回 typeof(System.Uri).Assembly 返回的任何内容 - 即 System.dll;我怀疑这是为了帮助诸如序列化、访问验证和其他想要知道某物来自什么程序集的代码之类的事情。从某种思维方式来看,这几乎是真的。
    • 但是如果我正确阅读了规范,typeof(List<Anything>).Assembly 必须始终返回mscorlib,这样可能会导致混淆。但显然调用assembly.GetTypes() 永远不会返回所有构造的 类型List<ActualType>,只能返回泛型定义List<>。只是为了打个比方。
    猜你喜欢
    • 1970-01-01
    • 2011-10-12
    • 2011-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    相关资源
    最近更新 更多