为什么数组不包含AsReadOnly方法?

时间:2018-04-06 04:21:14

标签: c# .net

List包含实例方法AsReadOnly

var list = new List<int>();
var readOnlyList = list.AsReadOnly();

创建ReadOnlyCollection

public ReadOnlyCollection<T> AsReadOnly()
{
    return new ReadOnlyCollection<T>((IList<T>) this);
}

但是数组只有静态方法:

var array = new int[] { };
var readOnlyArray = Array.AsReadOnly(array);

做同样的事:

public static ReadOnlyCollection<T> AsReadOnly<T>(T[] array)
{
    if (array == null)
        throw new ArgumentNullException(nameof (array));
    return new ReadOnlyCollection<T>((IList<T>) array);
}

为同等方法声明不同API的原因是什么?

3 个答案:

答案 0 :(得分:2)

Array是一个抽象类,是在泛型是.NET中的东西之前创建的。如果泛型一直是这个类,那么这个类几乎肯定是Array<T>而不是Array

但是,我们无法返回并更改基础基类。因此,我们无法将实例方法添加到类,该类强类型为数组的特定类型T

因此,它被添加为静态方法。

答案 1 :(得分:0)

这只是一个很长的评论,而不是你问题的答案。

很容易创建一个扩展方法,为您提供所需的语法:

yourArray.AsReadOnly()

有了这个,你可以做IList<>。这样做的好处是它也适用于碰巧实现static class MyExtensions { public static ReadOnlyCollection<TEntry> AsReadOnly<TEntry>(this TEntry[] arr) => Array.AsReadOnly(arr); } 的所有其他类型。

如果您不想这样,当然可以扩展数组:

img = Magick::Image.from_blob(text_svg) {
          self.format = 'SVG'
      }
img = img.first.to_blob {
         self.format = 'PNG'
      }

@img = Base64.encode64(img)

没有理由同时使用这两种方法。

答案 2 :(得分:0)

Array本质上是只读的,即您不能向其中添加项目并使其增长。这就是为什么我们没有像AsReadOnly这样的IList方法的原因。