Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么编译器和运行时假定字符串返回类型为动态的?_C#_C# 5.0 - Fatal编程技术网

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

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

在C#5和VS 2017中,我有

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