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的原因是什么?
答案 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
方法的原因。