为什么编译器和 运行-time 假设字符串 return 类型是动态的?

Why compiler and run-time assuming the string return type as dynamic?

在 C# 5 和 VS 2017 中,我有,

var json = JsonConvert.SerializeObject(items);
// why json is dynamic here

很明显,SerializeObject returns string 那么为什么 json 是动态类型而不是字符串。是的项目是动态类型。

Clearly, SerializeObject returns string then why json is dynamic type instead of string.

几乎每个涉及dynamic值的操作依次被认为是动态的。这包括方法调用和大多数运算符。唯一的例外是:

  • 构造函数调用(所以new Foo(someDynamicValue)的编译时类型仍然是Foo
  • is运算符(所以someDynamicValue is Foo的编译时类型仍然是bool
  • as运算符(所以someDynamicValue as Foo的编译时类型仍然是Foo
  • Cast 表达式(所以 (Foo) someDynamicValue 的编译时类型仍然是 Foo

如果您希望 json 的类型为 string,只需显式声明即可:

string json = JsonConvert.SerializeObject(items);

请注意,调用的 SerializeObject 的重载将取决于 items 的执行时类型 - 与静态绑定调用不同,即使在执行时发生任何参数的重载解析是动态的。

当然,如果您知道要调用 object 重载,您可以改为使用 items

var json = JsonConvert.SerializeObject((object) items);

现在调用是静态绑定的,编译器知道 return 类型是 string.