为什么C#中的类型推断不适用于动态对象和泛型方法?

时间:2017-05-16 16:20:29

标签: c# generics dynamic

我正在开发一个项目,该项目将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)发布。

0 个答案:

没有答案