【问题标题】:Arrays vs Generic in C#C# 中的数组与泛型
【发布时间】:2016-06-13 08:10:20
【问题描述】:

我注意到在 c# 中的数组实现了ICollection<T>。数组如何实现通用容器接口,但本身不是通用的?我们可以这样做吗?

编辑:我还想知道数组不是通用的,但它接受任何类型并具有类型安全性。

public class ListOfStrings : IList<string>
{
...
}

这是一个很好的例子,展示了我们可以从泛型创建非泛型(谢谢 MarcinJuraszek !!)。这个集合会被字符串卡住。我的猜测是它与字符串的泛型值类型声明无关,是一些我不熟悉的内部接线。

再次感谢您!

【问题讨论】:

  • 数组已经是通用的 - int[] 定义了一个 int 类型的数组。由于它是一种内置类型,我想有一些语法糖基本上是 Array&lt;int&gt;(但请注意,Array[] 不同 - 这只是一个示例)
  • 这完全有道理,这将真正帮助我在未来思考这个问题! int[] ~ 数组

标签: c# arrays generics icollection


【解决方案1】:

是的,完全有可能。你可以这样声明:

public class MyListOfStrings : IList<string>
{
}

只要你实现了IList&lt;string&gt; 要求的所有属性/方法,一切都会正常工作。如您所见,MyListOfStrings 不是通用的。

您还应该记住,数组是特殊类型,其中有很多事情发生在常规用户定义类型中。其中一些在MSDN上有所描述,似乎与您的问题相关的部分在这里:

从 .NET Framework 2.0 开始,Array 类实现了 System.Collections.Generic.IList&lt;T&gt;System.Collections.Generic.ICollection&lt;T&gt;System.Collections.Generic.IEnumerable&lt;T&gt; 通用接口。这些实现在运行时提供给数组,因此,泛型接口不会出现在 Array 类的声明语法中。此外,只有通过将数组转换为通用接口类型(显式接口实现)才能访问的接口成员没有参考主题。将数组转换为这些接口之一时要注意的关键是添加、插入或删除元素的成员会抛出 NotSupportedException

如您所见,Array 以一种特殊的方式实现了IList&lt;T&gt;ICollection&lt;T&gt;IEnumerable&lt;T&gt;,这不是您可以用自己的类型来做的事情。

【讨论】:

  • 我不熟悉这里的礼仪。我想澄清我的问题,但我不希望它看起来好像你没有回答我的问题。我只是进行编辑还是在这里问?这是一个关于数组接受任何类型但您的 MyListOfStrings 只接受字符串的想法的问题。他们如何使数组非泛型但接受任何类型?感谢您的编辑,顺便说一句。
  • 请随时更新您的问题并进行澄清。
  • @RyanWoods 一般来说,如果编辑使现有答案无效,最好在 cmets 中澄清(假设这是一个微小的变化),或者发布一个新问题。但请注意,在 cmets 中不断澄清问题被看不起 - 那时可能应该是一个新问题。
  • 是我遗漏了什么,还是数组不只是在 4.6.1 中实现非泛型版本或 IList、ICollection 等? referencesource.microsoft.com/#mscorlib/system/array.cs
  • 感谢您的回答。下次我会先看看MSDN。我会说我不会像你那样从 MSDN 收集到这些信息。你的解释更有意义。在你们、MarcinJuraszek 和 Rob 之间,我对这个话题有了更好的理解。谢谢。
猜你喜欢
  • 1970-01-01
  • 2017-08-21
  • 1970-01-01
  • 2013-06-27
  • 2010-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多