Frame<int, int>[] test = new Frame<int, int>[3] {{2,5},{3,6},{4,7}};
Run Code Online (Sandbox Code Playgroud)
数组初始值设定项只能在变量或字段初始值设定项中使用.请尝试使用新表达式.
怎么可能?
这里的问题是文字{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)
有一种解决方法.如果您定义具有以下两个特征的类型,则可以获得所需的语法:
IEnumerable.(实际上,它甚至不需要真正实现它;它只需要被定义为实现它.换句话说,该GetEnumerator方法不必做任何事情.)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)
| 归档时间: |
|
| 查看次数: |
854 次 |
| 最近记录: |