在声明中配对初始化,怎么做?

Joh*_*ack 2 c#

Frame<int, int>[] test = new Frame<int, int>[3] {{2,5},{3,6},{4,7}};
Run Code Online (Sandbox Code Playgroud)

数组初始值设定项只能在变量或字段初始值设定项中使用.请尝试使用新表达式.

怎么可能?

Dan*_*Tao 6

这里的问题是文字{2,3}本身并不代表一个Frame<int, int>.它仅用作初始化程序的一部分,这意味着它必须伴随实例化,如下所示:

Frame<int, int>[] test = new Frame<int, int>[]
{
    new Frame<int, int>(2, 5),
    new Frame<int, int>(3, 6),
    new Frame<int, int>(4, 7)
};
Run Code Online (Sandbox Code Playgroud)

有一种解决方法.如果您定义具有以下两个特征的类型,则可以获得所需的语法:

  1. 该类型必须实现IEnumerable.(实际上,它甚至不需要真正实现它;它只需要被定义为实现它.换句话说,该GetEnumerator方法不必做任何事情.)
  2. 类型必须有一个Add方法.

现在,该Add要求定义了初始化语法的工作原理.所以这是一个例子,使用FrameCollection纯粹为初始化Frame<int, int>[]数组而设计的类:

// Skeleton code for illustration only.
class Frame<T1, T2>
{
    public Frame(T1 x, T2 y)
    {
        X = x;
        Y = y;
    }

    public T1 X { get; private set; }
    public T2 Y { get; private set; }
}

// IEnumerable (non-)implementation for initializer syntax.
class FrameCollection : IEnumerable
{
    List<Frame<int, int>> _frames;

    public FrameCollection()
    {
        _frames = new List<Frame<int, int>>();
    }

    // Add method to enable initialization syntax using { x, y }.
    public void Add(int x, int y)
    {
        _frames.Add(new Frame<int, int>(x, y));
    }

    public Frame<int, int>[] ToArray()
    {
        return _frames.ToArray();
    }

    // This method doesn't technically need to do anything.
    IEnumerator IEnumerable.GetEnumerator()
    {
        throw new InvalidOperationException();
    }
}
Run Code Online (Sandbox Code Playgroud)

因为FrameCollection类定义了一个Add接受两个int参数的方法,所以我们现在可以编写如下代码:

var frames = new FrameCollection
{
    { 2, 5 },
    { 3, 6 },
    { 4, 7 }
};

foreach (Frame<int, int> frame in frames.ToArray())
{
    Console.WriteLine("({0}, {1})", frame.X, frame.Y);
}
Run Code Online (Sandbox Code Playgroud)

输出:

(2, 5)
(3, 6)
(4, 7)