dynamic d = 5;
var array = new[] {d,"hello"}
array
的隐式类型是什么?它是dynamic[]
但不是string[]
,为什么?
在深入探讨C#时,Jon Skeet阐述了动态转换的规则:
从动态类型的任何表达式到存在隐式转换 几乎所有CLR类型
后来他提到他故意说从动态类型本身的 “表达式转换而不是动态类型本身。
你可能也注意到我写了一篇关于转换的文章 动态类型的表达式“到CLR类型,而不是来自的转换 动态类型本身。这种微妙有助于在类型推断和 其他需要考虑隐式转换的情况 类型
我有点困惑或者可能缺乏一些非常基本的东西,但这解释了为什么array
类型被证明是dynamic[]
而不是string[]
。有人可以帮我理解他的真正含义。
答案 0 :(得分:4)
在大多数情况下,您可以忽略此细节。但是,如果您查看规范,您会看到该语言考虑从类型X
到类型Y
的转换的各种位置。还有其他地方语言会考虑从表达式e
到类型T
的转换,通常会对确切的表达式进行一些限制。
最简单的例子是常数。没有从int
到byte
的隐式转换,但 是来自“int
类型的常量表达式的隐式转换,其值在范围内byte
“至byte
。
同样地,没有从dynamic
到string
的转换(例如),但是是从“具有静态类型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
。
底线:类型推断是一个真正的,非常多毛的规范。有两种不同的转换方式,值得了解它们,但大多数时候你都不用担心。