【问题标题】:var array = new [] {d, "hello"} is implicitly typed to dynamic[] and not string[] ? why?var array = new [] {d, "hello"} 被隐式输入为 dynamic[] 而不是 string[] ?为什么?
【发布时间】:2018-08-31 00:25:24
【问题描述】:
dynamic d = 5;
var array = new[] {d,"hello"}

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

在深入了解 C# 时 - Jon Skeet 陈述了动态转换的规则:

从任何动态类型的表达式到 几乎任何 CLR 类型

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

您可能还注意到我写过关于“从 动态类型的表达式”到 CLR 类型,而不是从 动态类型本身。这种微妙之处有助于类型推断和 其他需要考虑隐式转换的情况 类型

我有点困惑或者可能缺少一些非常基本的东西,但这解释了为什么 array 类型原来是 dynamic[] 而不是 string[]。谁能帮我理解他的真正意思。

【问题讨论】:

  • 听起来对我有误导性。编译器很乐意将 dynamic 类型的变量或表达式转换为任何东西。它必须,它不知道具体运行时类型的 bean,所以只能假设你做对了。但这并不意味着这会在运行时成功。
  • @HansPassant:谢谢!!我认为下面 Jon dynamic d = 5; var array = new[] { "hello", d }; 的示例说明为什么 array 的类型是 dynamic[] 而不是 string[] 有助于理解意图。

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


【解决方案1】:

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

最简单的例子是常量。没有从intbyte 的隐式转换,但是从“int 类型的常量表达式和值在byte 范围内的值”到@的隐式转换987654329@.

同样,没有从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 };

...即使有从常量表达式 10byte 的隐式转换,最终也是 int[]

底线:类型推断是规范中非常非常棘手的部分。有这两种不同类型的转换,值得了解它们,但大多数时候您无需担心。

【讨论】:

  • 感谢乔恩!!示例:没有从 int 到 byte 的隐式转换,但存在从“int 类型的常量表达式且值在 byte 范围内”到 byte 的隐式转换。 确实帮助我可视化了意图。
  • @RahulAgarwal:呼 :) 这是一个复杂而微妙的领域。深入编写 C# 的困难之一是我希望在任何地方都在技术上准确 - 但有些位需要非常多的细节才能使这些技术上准确的陈述尽可能清晰。
  • 我同意 :) 虽然byte = 5; 编译得很好并且符合从int 类型表达式到byte 的隐式转换,但int x = 5; byte y = x; 是一个问题。但是,dynamic d = "test"; string str= d; 编译得很好
猜你喜欢
  • 2017-10-27
  • 1970-01-01
  • 1970-01-01
  • 2018-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-01
相关资源
最近更新 更多