【发布时间】:2018-03-27 11:41:03
【问题描述】:
今天我在看Nancy 的一些代码,因为我喜欢探索代码,所以我注意到以下内容。
在 VS2017 中导航时,我去了NancyModule,我从元数据中看到了以下代码:
现在我不知道这个属性有什么作用,所以我立即去了msdn。
参数
转换标志: 类型:System.Boolean[] 指定,在类型构造的前缀遍历中,哪些 Object 出现应被视为动态分派的类型。
备注
例如,如果 C 是具有两个类型参数的泛型类型,则使用构造的类型 C 可能旨在动态处理第一个类型参数,而通常处理第二个类型参数,在这种情况下,应适当的属性规范使用 { false, true, false } 的 transformFlags 值。
之后我意识到在 Nancy 的 code 中没有应用这样的属性,所以我想自己“好吧,也许编译器会添加它。”但是,在使用 dnSpy、ilSpy 反编译此程序集后,我根本看不到这样的属性。
所以底线问题是:
- 此属性是供 .NET 框架的用户使用,还是只有编译器应用它(考虑到它的命名空间)?
- 这些标志在其构造函数中意味着什么?我不确定我是否理解类型构造的前缀遍历。
【问题讨论】:
-
当使用 ILSpy 时,看看当你切换到 IL 而不是 C# 时是如何反编译的。您应该会看到该属性出现。
dynamic只是object的底层,其属性表明实际类型是dynamic而不仅仅是普通的object。同样,Func<dynamic, object>实际上是Func<object, object>,指定第一个参数的属性是dynamic。 VS 使用的反编译器不够聪明,无法将其转回“规范”C#。