【问题标题】:How does an array in C# gets derived from System.Array?C# 中的数组如何从 System.Array 派生?
【发布时间】:2020-11-18 15:27:26
【问题描述】:

我们知道如何定义如下数组,但它是如何从System.Array 派生的?

int[] intArray = new int[] { 2, 4, 7 };

上面的例子是一个简单的int 数组,但假设我有Student 类,我创建了一个学生数组,它仍然会从System.Array 派生。

上面的代码声明是完全限定声明的某种快捷方式吗?

【问题讨论】:

  • 使用类型和定义该类型是两件非常不同的事情。您尚未在显示的代码中定义任何类型。

标签: c# arrays .net


【解决方案1】:

System.Array 类型

System.Array 类型是所有数组类型的抽象基类型。一个 隐式引用转换(Implicit reference conversions)存在 从任何数组类型到 System.Array,以及显式引用 System.Array 中存在转换(显式引用转换) 到任何数组类型。请注意,System.Array 本身不是 array_type。 相反,它是一个 class_type,所有 array_types 都从该 class_type 派生而来。

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/arrays#the-systemarray-type

上面的代码声明是完全限定声明的某种快捷方式吗?

没有。通过将[] 添加到其他类型来声明数组类型的语言已经融入其中。语言中最初不存在泛型,或者 int[] 可能是 Array<int> 或类似的简写。

【讨论】:

    【解决方案2】:

    C# 中的许多功能都是语言的一部分,并在编译步骤中转换为适当的类型或类型的抽象。 int 本身就是框架中的 Int32。 VB.NET 甚至更多地使用 VB-ish 快捷方式。

    已从错误问题中删除链接。稍后可以再次编辑。

    【讨论】:

    • 这不是语法糖; .NET 运行时也特别以这种方式支持数组(参见 ECMA-335 II.14)。而且我不确定您发布的链接与数组有什么关系?看起来它是关于从 PDF 中提取图像,而不是关于运行时处理数组的方式。
    • C# 语言支持 int[]、string[] 等,并在 C# 编译器中将它们转换为正确的底层类型。我没有建议这是语法糖。它只是一个编译器步骤,因为它创建了 IL。 VB 也有一些被转换的语法。使用 using 进行实例化也很像 try ... finally 在编译器中以确保调用 Dispose()。也不是魔术,只是编译。除了弄乱链接之外,我还试图弄清楚您不同意什么。也许是我 20 年来没有学到的东西?如果是这样,很高兴学习。
    • 我主要不同意你的链接,因为它看起来不正确,我怀疑它可能是垃圾邮件。我已经取消了我的反对票。我仍然觉得“C# 中的许多特性都是语言的一部分,并且在编译步骤中被转换为适当的类型或类型的抽象”,至少 暗示 某种形式的语法糖用于数组,但我知道这可能不是您的本意。
    猜你喜欢
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    • 2014-03-16
    • 1970-01-01
    • 1970-01-01
    • 2019-03-18
    • 2011-04-20
    • 1970-01-01
    相关资源
    最近更新 更多