代码之家  ›  专栏  ›  技术社区  ›  rahulaga-msft

var array=new[]{d,“hello”}隐式类型化为dynamic[],而不是string[]?为什么?

  •  1
  • rahulaga-msft  · 技术社区  · 6 年前
    dynamic d = 5;
    var array = new[] {d,"hello"}
    

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

    在深入学习C时,Jon Skeet提出了动态转换的规则:

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

    后来他提到,他故意说 “动态类型的表达式” 但不是从动态类型本身。

    您可能还注意到,我写了一篇关于从 动态类型的表达式转换为CLR类型,而不是从 动态类型本身。在类型推断和 需要考虑之间隐式转换的其他情况 类型

    我有点困惑或者可能缺乏一些非常基本的东西,但这解释了为什么 大堆 类型为 动态[] 而不是 字符串[] 。有人能帮我理解他的真正意思吗。

    1 回复  |  直到 6 年前
        1
  •  4
  •   Jon Skeet    6 年前

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

    最简单的例子就是常数。没有从 int byte ,但在那里 “类型的常量表达式”的隐式转换 内景 值在以下范围内 字节 “收件人 字节

    同样,也没有从 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 字节

    一句话:类型推断在规范中是一个非常非常棘手的问题。有这两种不同的转换,值得注意,但大多数时候你不必担心。