泛型 class 中的 GetEnumerator 实现
GetEnumerator realization within generic class
我有一个自定义数组 class public class CustomArray<T> : IEnumerable<T>
具有通用 属性:
public T[] Array
{
get;
}
如何实现 GetEnumerator?我现在拥有的:
public IEnumerator<T> GetEnumerator()
{
return (IEnumerator<T>)Array.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return Array.GetEnumerator();
}
但是第一个没有通过单元测试。
结果消息:
System.InvalidCastException : Unable to cast object of type 'System.SZArrayEnumerator' to type 'System.Collections.Generic.IEnumerator`1[System.Int32]'.
IEnumerable.GetEnumerator()
和IEnumerabl<T>.GetEnumerator()
两个签名相同,正常声明会冲突
因此,一般前者直接添加(作为较旧的接口),后者作为显式接口实现添加,只能通过显式转换访问:
public IEnumerator<T> GetEnumerator()
{
return ((IEnumerable<T>)Array).GetEnumerator();
}
旁注:
一维数组实际上并不直接实现任何接口。这是因为 Array
class 中的所有代码都不知道类型或维度,并且无法使用静态类型访问数组。
因此 a class called SZArrayHelper
实现了所有接口,并且 CLR 被编码为使用技巧来转换数组,就好像它们实际上是那种类型一样。
我有一个自定义数组 class public class CustomArray<T> : IEnumerable<T>
具有通用 属性:
public T[] Array
{
get;
}
如何实现 GetEnumerator?我现在拥有的:
public IEnumerator<T> GetEnumerator()
{
return (IEnumerator<T>)Array.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return Array.GetEnumerator();
}
但是第一个没有通过单元测试。
结果消息:
System.InvalidCastException : Unable to cast object of type 'System.SZArrayEnumerator' to type 'System.Collections.Generic.IEnumerator`1[System.Int32]'.
IEnumerable.GetEnumerator()
和IEnumerabl<T>.GetEnumerator()
两个签名相同,正常声明会冲突
因此,一般前者直接添加(作为较旧的接口),后者作为显式接口实现添加,只能通过显式转换访问:
public IEnumerator<T> GetEnumerator()
{
return ((IEnumerable<T>)Array).GetEnumerator();
}
旁注:
一维数组实际上并不直接实现任何接口。这是因为 Array
class 中的所有代码都不知道类型或维度,并且无法使用静态类型访问数组。
因此 a class called SZArrayHelper
实现了所有接口,并且 CLR 被编码为使用技巧来转换数组,就好像它们实际上是那种类型一样。