- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Array
声明:
public abstract class Array
: ICloneable, IList, ICollection, IEnumerable {
public partial class Array<T>
: ICloneable, IList<T>, ICollection<T>, IEnumerable<T> {
Array<T>
派生出来? ?如public partial class Array: Array<object> {
最佳答案
历史
What problems would arise if arrays became a generic type?
Mammoth[] mammoths = new Mammoth[10];
Animal[] animals = mammoths; // Covariant conversion
animals[1] = new Giraffe(); // Run-time exception
Mammoth[]
至
Animal[]
,你以前可以做的事情(即使它坏了)。因此,使数组通用会破坏很多代码。
Array<Mammoth> mammoths = new Array<Mammoth>(10);
Array<Animal> animals = mammoths; // Not allowed.
IEnumerable<Animals> animals = mammoths; // Covariant conversion
Why don't arrays implement the generic
IList<T>
,ICollection<T>
andIEnumerable<T>
interfaces?
T[]
确实实现
IEnumerable<T>
,
ICollection<T>
和
IList<T>
自动。1 来自
Array
class documentation :
Single-dimensional arrays implement the
IList<T>
,ICollection<T>
,IEnumerable<T>
,IReadOnlyList<T>
andIReadOnlyCollection<T>
generic interfaces. The implementations are provided to arrays at run time, and as a result, the generic interfaces do not appear in the declaration syntax for the Array class.
Can you use all members of the interfaces implemented by arrays?
The key thing to be aware of when you cast an array to one of these interfaces is that members which add, insert, or remove elements throw
NotSupportedException
.
ICollection<T>
有一个
Add
方法,但您不能向数组添加任何内容。它会抛出异常。这是 .NET Framework 中早期设计错误的另一个示例,它将在运行时向您抛出异常:
ICollection<Mammoth> collection = new Mammoth[10]; // Cast to interface type
collection.Add(new Mammoth()); // Run-time exception
ICollection<T>
不是协变的(出于明显的原因),你不能这样做:
ICollection<Mammoth> mammoths = new Array<Mammoth>(10);
ICollection<Animal> animals = mammoths; // Not allowed
IReadOnlyCollection<T>
interface这也由 hood1 下的数组实现,但它仅包含
Count
所以用途有限。
Array
If arrays were generic, would we still need the non-generic
Array
class?
IList
,
ICollection
和
IEnumerable
接口(interface)通过它们的基类
Array
.这是为所有数组提供特定方法和接口(interface)的唯一合理方式,并且是
Array
的主要用途。基类。您会看到枚举的相同选择:它们是值类型但从
Enum
继承成员;和从
MulticastDelegate
继承的委托(delegate).
Could the non-generic base class
Array
be removed now that generics are supported?
Array<T>
上定义。如果它曾经出现过的话。然后你可以写,例如,
Copy<T>(T[] source, T[] destination)
而不是
Copy(Array source, Array destination)
具有某种类型安全的额外好处。
Array
可用于引用任何数组,而不管其元素的类型。就像如何
IEnumerable<T>
继承自
IEnumerable
(仍在某些 LINQ 方法中使用)。
Could the
Array
base class derive fromArray<object>
?
Array<T> : Array : Array<object> : Array : ...
.此外,这意味着您可以将任何对象存储在数组中(毕竟,所有数组最终都会从类型
Array<object>
继承)。
Could the new generic array type
Array<T>
be added without impacting existing code too much?
T[]
Array<T>
的语法语法糖(就像
T?
是
Nullable<T>
的语法糖一样),并且仍然使用在内存中连续分配数组的特殊指令和支持。
Mammoth[]
数组的能力。到它们的一种基本类型
Animal[]
,类似于您无法转换的方式
List<Mammoth>
至
List<Animal>
.但是数组协方差无论如何都被破坏了,并且有更好的选择。
Alternatives to array covariance?
IList<T>
.如果
IList<T>
接口(interface)被制成适当的协变接口(interface)然后你可以转换任何数组
Array<Mammoth>
(或任何与此相关的列表)到
IList<Animal>
.但是,这需要
IList<T>
要重写的接口(interface)以删除所有可能更改底层数组的方法:
interface IList<out T> : ICollection<T>
{
T this[int index] { get; }
int IndexOf(object value);
}
interface ICollection<out T> : IEnumerable<T>
{
int Count { get; }
bool Contains(object value);
}
T
,因为这会破坏协方差。然而,
object
对于
Contains
和
IndexOf
已经足够了,当传递一个对象时,它们只会返回
false
类型不正确。实现这些接口(interface)的集合可以提供自己的通用
IndexOf(T value)
和
Contains(T value)
。)
Array<Mammoth> mammoths = new Array<Mammoth>(10);
IList<Animals> animals = mammoths; // Covariant conversion
Array<T>
如果在 C# 和 .NET 中实现,结合真正的协变
IList<T>
类型将起作用和
ICollection<T>
上面描述的接口(interface),它工作得很好。我还添加了不变式
IMutableList<T>
和
IMutableCollection<T>
提供我的新
IList<T>
的变异方法的接口(interface)和
ICollection<T>
接口(interface)缺乏。
M42.Collections – Specialized collections with more functionality, features and ease-of-use than the built-in .NET collection classes.
T[]
在 .Net 4.5 中通过其基类实现
Array
:
ICloneable
,
IList
,
ICollection
,
IEnumerable
,
IStructuralComparable
,
IStructuralEquatable
;并默默地通过运行时:
IList<T>
,
ICollection<T>
,
IEnumerable<T>
,
IReadOnlyList<T>
, 和
IReadOnlyCollection<T>
.
关于c# - 为什么 Array 不是泛型类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14324987/
我正在尝试编写一个相当多态的库。我遇到了一种更容易表现出来却很难说出来的情况。它看起来有点像这样: {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE
谁能解释一下这个表达式是如何工作的? type = type || 'any'; 这是否意味着如果类型未定义则使用“任意”? 最佳答案 如果 type 为“falsy”(即 false,或 undef
我有一个界面,在IAnimal.fs中, namespace Kingdom type IAnimal = abstract member Eat : Food -> unit 以及另一个成功
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: What is the difference between (type)value and type(va
在 C# 中,default(Nullable) 之间有区别吗? (或 default(long?) )和 default(long) ? Long只是一个例子,它可以是任何其他struct类型。 最
假设我有一个案例类: case class Foo(num: Int, str: String, bool: Boolean) 现在我还有一个简单的包装器: sealed trait Wrapper[
这个问题在这里已经有了答案: Create C# delegate type with ref parameter at runtime (1 个回答) 关闭 2 年前。 为了即时创建委托(dele
我正在尝试获取图像的 dct。一开始我遇到了错误 The function/feature is not implemented (Odd-size DCT's are not implemented
我正在尝试使用 AFNetworking 的 AFPropertyListRequestOperation,但是当我尝试下载它时,出现错误 预期的内容类型{( “应用程序/x-plist” )}, 得
我在下面收到错误。我知道这段代码的意思,但我不知道界面应该是什么样子: Element implicitly has an 'any' type because index expression is
我尝试将 SignalType 从 ReactiveCocoa 扩展为自定义 ErrorType,代码如下所示 enum MyError: ErrorType { // .. cases }
我无法在任何其他问题中找到答案。假设我有一个抽象父类(super class) Abstract0,它有两个子类 Concrete1 和 Concrete1。我希望能够在 Abstract0 中定义类
我想知道为什么这个索引没有用在 RANGE 类型中,而是用在 INDEX 中: 索引: CREATE INDEX myindex ON orders(order_date); 查询: EXPLAIN
我正在使用 RxJava,现在我尝试通过提供 lambda 来订阅可观察对象: observableProvider.stringForKey(CURRENT_DELETED_ID) .sub
我已经尝试了几乎所有解决问题的方法,其中包括。为 提供类型使用app.use(express.static('public'))还有更多,但我似乎无法为此找到解决方案。 index.js : imp
以下哪个 CSS 选择器更快? input[type="submit"] { /* styles */ } 或 [type="submit"] { /* styles */ } 只是好
我不知道这个设置有什么问题,我在 IDEA 中获得了所有注释(@Controller、@Repository、@Service),它在行号左侧显示 bean,然后转到该 bean。 这是错误: 14-
我听从了建议 registering java function as a callback in C function并且可以使用“简单”类型(例如整数和字符串)进行回调,例如: jstring j
有一些 java 类,加载到 Oracle 数据库(版本 11g)和 pl/sql 函数包装器: create or replace function getDataFromJava( in_uLis
我已经从 David Walsh 的 css 动画回调中获取代码并将其修改为 TypeScript。但是,我收到一个错误,我不知道为什么: interface IBrowserPrefix { [
我是一名优秀的程序员,十分优秀!