var array = new [] {d,“hello”}隐式输入到dynamic []而不是string []?为什么呢?

时间:2018-03-21 18:18:02

标签: c# dynamic type-conversion implicit-conversion

dynamic d = 5;
var array = new[] {d,"hello"}

array的隐式类型是什么?它是dynamic[]但不是string[],为什么?

在深入探讨C#时,Jon Skeet阐述了动态转换的规则:

  

从动态类型的任何表达式到存在隐式转换   几乎所有CLR类型

后来他提到他故意说从动态类型本身的 “表达式转换而不是动态类型本身。

  

你可能也注意到我写了一篇关于转换的文章   动态类型的表达式“到CLR类型,而不是来自的转换   动态类型本身。这种微妙有助于在类型推断和   其他需要考虑隐式转换的情况   类型

我有点困惑或者可能缺乏一些非常基本的东西,但这解释了为什么array类型被证明是dynamic[]而不是string[]。有人可以帮我理解他的真正含义。

1 个答案:

答案 0 :(得分:4)

在大多数情况下,您可以忽略此细节。但是,如果您查看规范,您会看到该语言考虑从类型X到类型Y的转换的各种位置。还有其他地方语言会考虑从表达式e到类型T的转换,通常会对确切的表达式进行一些限制。

最简单的例子是常数。没有从intbyte的隐式转换,但 是来自“int类型的常量表达式的隐式转换,其值在范围内byte“至byte

同样地,没有从dynamicstring的转换(例如),但是从“具有静态类型dynamic的表达式转换”到string

这对于隐式类型数组这样的事情很重要。考虑一下这个表达式:

dynamic d = GetSomeDynamicValue(); // Compiler doesn't know or care actual value
var array = new[] { "hello", d };

array的类型应该是什么?它最终是dynamic[],而不是string[] - 我相信是由于转换类型的不同而导致的。就是这样:

byte b = 10;
var array = new[] { b, 10 };

...即使存在从常量表达式int[]10的隐式转换,也最终成为byte

底线:类型推断是一个真正的,非常多毛的规范。有两种不同的转换方式,值得了解它们,但大多数时候你都不用担心。