为什么编译器和 运行-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
.
在 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
.