読者です 読者をやめる 読者になる 読者になる

可変長引数のインデクサって何に使うんだろ・・・

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];

みたいな!