我正在开发一个项目,该项目将C#泛型与dynamic关键字结合使用,以实现一个简单的原型文件Caffe文件解析器,该解析器基于Google协议缓冲项目中的proto2语法。
解析器使用非常简单的语法来读取原型文件并将值存储在类型为Dictionary<string, dynamic>
的字典中。
动态对象用于实现对值的非常灵活的访问,并在解析过程中启用类型的嵌套,例如Dictionary<string, Dictionary<string, dynamic>>
,并且通用方法用于类型转换以启用自动完成和重新安全类型安全。
请参阅以下方案:
// prototxt file
layer {
name: "conv2/norm2"
…
lrn_param {
local_size: 5
…
}
}
// method in C#
public T Try<T>(dynamic dict, string key, T @default = default(T)) {
var result = @default;
try {
result = (T)dict[key];
} catch {} // do nothing
return result;
}
…
// usage
var learnParamDict = Try<Dictionary<string, dynamic>>(layer, “lrn_param”);
现在我的问题:
使用上面的代码时,编译器并没有真正得到方法的返回类型被键入Dictionary<string, dynamic>
并且只显示动态,但是当用光标指向Try方法Visual Studio(编译器)时)确实描述了正确的类型:see image - part 1
我进一步尝试并发现您可以完全忽略Generic声明和静态类型定义,但这当然会导致运行时错误:see image - part 2
现在问我的问题:
使用泛型时,动态类型推断的正确行为是什么? /为什么动态对象和泛型的类型推断有点不清楚?
编译器是否应该至少检测到我不能在不声明类型的情况下使用var和泛型方法?
元信息:
我正在使用C#6和.NET Framework 4.6.2的Target框架设置,并使用Visual Studio 2017版本15.1(26403.7)发布。