gpt4 book ai didi

c# - 声明中对初始化,怎么做?

转载 作者:行者123 更新时间:2023-11-30 19:32:55 25 4
gpt4 key购买 nike

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类定义了一个 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);
}

输出:

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

关于c# - 声明中对初始化,怎么做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4587351/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com