[英]var array = new [] {d, “hello”} is implicitly typed to dynamic[] and not string[] ? why?
dynamic d = 5;
var array = new[] {d,"hello"}
array
的隐式类型是什么? 它是dynamic[]
但不是string[]
,为什么?
在深入研究C#时-乔恩·斯凯特(Jon Skeet)提出了动态转换的规则:
存在从任何动态类型的表达式到几乎所有CLR类型的隐式转换
后来他提到,他故意说从“动态类型的表达式”进行转换, 而不是从动态类型本身进行转换。
您可能还已经注意到,我写过有关“从动态类型的表达式”到CLR类型的转换,而不是从动态类型本身的转换。 这种精妙之处在类型推断和其他需要考虑类型之间隐式转换的情况下有帮助
我有点困惑或可能缺少一些基本知识,但这解释了为什么array
类型原来是dynamic[]
而不是string[]
。 有人可以帮我理解他的真正意思吗?
在大多数情况下,您可以忽略此详细信息。 但是,如果您仔细阅读该规范,将会发现该语言考虑从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 };
...即使是从常量表达式10
到byte
的隐式转换,也仍然是int[]
。
底线:类型推断确实是规范中非常繁琐的部分。 有两种不同的转换方式,值得一提,但大多数时候您无需担心。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.