簡體   English   中英

在聲明中配對初始化,怎么做?

[英]Pair initialization in declaration, How to do it?

Frame<int, int>[] test = new Frame<int, int>[3] {{2,5},{3,6},{4,7}};

數組初始值設定項只能在變量或字段初始值設定項中使用。 請嘗試使用新表達式。

怎么可能?

這里的問題是文字{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)
};

有一種解決方法。 如果您定義具有以下兩個特征的類型,則可以獲得所需的語法:

  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();
    }
}

因為FrameCollection類定義了一個接受兩個int參數的Add方法,所以我們現在可以編寫如下代碼:

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);
}

輸出:

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

你確定不應該這樣嗎?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM