可変長引数のインデクサって何に使うんだろ・・・
class Program { int this[params int[] args] { get { return args[args.Length - 1]; } } static void main(string[] args) { Program p = new Program(); Console.WriteLine(p[0, 1, 2, 3]); // => 3 } }
うーん、何に使えるだろ?例えばこんなの?
public interface ICollectionGen<TResult, TArg> where TResult : IEnumerable<TArg> { TResult this[params TArg[] args] { get; } } public sealed class ArrayGen<TArg> : ICollectionGen<TArg[], TArg> { public TArg[] this[params TArg[] args] { get { return args; } } } public sealed class ListGen<TArg> : ICollectionGen<List<TArg>, TArg> { public List<TArg> this[params TArg[] args] { get { return new List<TArg>(args); } } } class Program { static void printCollection<TResult>(ICollectionGen<TResult, int> gen) where TResult : IEnumerable<int> { foreach (int i in gen[1, 2, 3, 4, 5]) { Console.Write(i + " "); } Console.WriteLine(); } static void Main(string[] args) { printCollection(new ArrayGen<int>()); printCollection(new ListGen<int>()); } }
インデクサである必要性が全く感じられないw
static なインデクサがあれば、可変長引数のインデクサと (と、さらにジェネリックなインデクサ) 併せてリテラルもどきを作れるんだけどなぁ・・・
以下妄想。
public class Set<T> : ... { // 実際はコンパイルできない public static Set<S> this<S>[params S[] args] { get { return new Set<S>(args); } } ... }
Set<int> s = Set[1, 2, 3, 4];
みたいな!