C# 为什么编译器和运行时假定字符串返回类型为动态的?
在C#5和VS 2017中,我有C# 为什么编译器和运行时假定字符串返回类型为动态的?,c#,c#-5.0,C#,C# 5.0,在C#5和VS 2017中,我有 var json = JsonConvert.SerializeObject(items); // why json is dynamic here 显然,SerializeObject返回字符串,那么为什么json是动态类型而不是字符串。是项是动态类型 显然,SerializeObject返回字符串,那么为什么json是动态类型而不是字符串 几乎所有涉及动态值的操作都被认为是动态的。这包括方法调用和大多数运算符。唯一的例外是: 构造函数调用(因此newf
var json = JsonConvert.SerializeObject(items);
// why json is dynamic here
显然,SerializeObject返回字符串,那么为什么json是动态类型而不是字符串。是项是动态类型
显然,SerializeObject返回字符串,那么为什么json是动态类型而不是字符串
几乎所有涉及动态值的操作都被认为是动态的。这包括方法调用和大多数运算符。唯一的例外是:
- 构造函数调用(因此
newfoo(someDynamicValue)
的编译时类型仍然是Foo
)
是
运算符(因此someDynamicValue的编译时类型是Foo
仍然是bool
)
as
运算符(因此someDynamicValue as Foo
的编译时类型仍然是Foo
)
- 强制转换表达式(因此
(Foo)someDynamicValue
的编译时类型仍然是Foo
)
如果希望json
的类型为string
,只需明确声明:
string json = JsonConvert.SerializeObject(items);
请注意,调用的序列化对象
的重载将取决于项
的执行时间类型-与静态绑定调用不同,当任何参数都是动态的时,即使重载解析也会在执行时发生
当然,如果您知道要调用对象
重载,您可以强制转换项
:
var json = JsonConvert.SerializeObject((object) items);
现在调用是静态绑定的,编译器知道返回类型是string
您可能希望将异常列表修复为操作符,其中的示例使用is
关键字而不是as
。