这是一个非常简单的问题,如果我想在C#中指定新数组的确切值,我所做的就是:
foo[] arr = {10, 15, 24};
是否可以使用自定义结构执行此操作?
e.g。
public struct Vec3
{
float[] MyVals;
public float this[int a]
{
get
{
...
}
set
{
...
}
}
}
public class MainRoutine
{
public static Vec3 SuperVector = {2, 5, 6};
.....
}
答案 0 :(得分:1)
不是那样的。 C#不知道每个值应该映射到什么(想象你有一个更复杂的结构)。在一个数组(或任何其他集合,顺便说一句),它显而易见;提供的元素只是组成数组。
但是,你可以这样做:
public static Vec3 SuperVector = new Vec3
{
MyVals = new float[]{2, 5, 6}
}
如果您将MyVals
作为公共财产。当然,您也可以在构造函数(或数组)中传递元素。
有关对象初始值设定项的详细信息,请参阅MSDN。
答案 1 :(得分:1)
做了类似的事
class Program
{
public static Vec3 SuperVector = new Vec3 { 2, 5, 6 };
static void Main(string[] args)
{
Console.WriteLine(SuperVector[0]);
Console.WriteLine(SuperVector[1]);
Console.WriteLine(SuperVector[2]);
Console.ReadLine();
}
}
public struct Vec3: IEnumerable
{
List<float> MyVals;
public float this[int a]
{
get
{
return MyVals[a];
}
set
{
InitiailaizeMyValIfEmpty();
MyVals[a] = value;
}
}
public IEnumerator GetEnumerator()
{
throw new NotImplementedException();
}
public void Add(float f)
{
InitiailaizeMyValIfEmpty();
MyVals.Add(f);
}
private void InitiailaizeMyValIfEmpty()
{
if (MyVals == null)
MyVals = new List<float>();
}
}
答案 2 :(得分:1)
使用operator overloading可以执行此操作:
public struct Vec3
{
private float[] MyVals;
public float this[int a]
{
get { return MyVals[a]; }
set { MyVals[a] = value; }
}
public static implicit operator float[](Vec3 vec)
{
return vec.MyVals;
}
public static implicit operator Vec3(float[] values)
{
var v = new Vec3();
v.MyVals = values;
return v;
}
}
public static Vec3 SuperVector = new[] { 2f, 5f, 6f };
ofcourse new[]
是new float[]
的简写,这不完全是你想要的,但我认为它是最接近的。此数组初始化程序语法int[] arr = { 2, 3, 4 }
只能用于数组,因此无论如何都不可能。