为什么编译器和运行时假设字符串返回类型为动态?

use*_*567 0 c# c#-5.0

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

var json = JsonConvert.SerializeObject(items);
// why json is dynamic here
Run Code Online (Sandbox Code Playgroud)

显然,SerializeObject返回字符串然后为什么json是动态类型而不是字符串.是项目是动态类型.

在此输入图像描述

Jon*_*eet 10

显然,SerializeObject返回字符串然后为什么json是动态类型而不是字符串.

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

  • 构造函数调用(所以编译时类型new Foo(someDynamicValue)仍然是Foo)
  • is操作者(这样的编译时间类型someDynamicValue is Foo仍是bool)
  • as操作者(这样的编译时间类型someDynamicValue as Foo仍是Foo)
  • Cast表达式(所以编译时类型(Foo) someDynamicValue仍然是Foo)

如果你想要的类型jsonstring,刚刚宣布明确:

string json = JsonConvert.SerializeObject(items);
Run Code Online (Sandbox Code Playgroud)

注意,被SerializeObject调用的重载将取决于执行时间类型items- 与静态绑定调用不同,甚至在任何参数是动态的时候执行时都会发生重载解析.

当然,如果你知道你想要调用object重载,你可以items改为:

var json = JsonConvert.SerializeObject((object) items);
Run Code Online (Sandbox Code Playgroud)

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