是否可以重载“数组赋值”?对于自定义结构体
本文关键字:结构体 自定义 数组赋值 赋值 重载 数组 是否 | 更新日期: 2023-09-27 18:13:02
这是一个非常简单的问题,如果我想在c#中指定一个新数组的确切值,我所要做的就是:
foo[] arr = {10, 15, 24};
是否有可能使用自定义结构来做到这一点?
。
public struct Vec3
{
float[] MyVals;
public float this[int a]
{
get
{
...
}
set
{
...
}
}
}
public class MainRoutine
{
public static Vec3 SuperVector = {2, 5, 6};
.....
}
使用操作符重载可以这样做:
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 };
当然new[]
是new float[]
的简写,这不是你想要的,但我认为它是最接近的。这个数组初始化器语法int[] arr = { 2, 3, 4 }
只能用于数组,所以无论如何都不可能。
不是那样的。c#不知道这些值应该映射到什么(假设你有一个更复杂的结构体)。在数组(或任何其他集合)中,这是显而易见的;所提供的元素只是组成数组。
但是,你可以这样做:
public static Vec3 SuperVector = new Vec3
{
MyVals = new float[]{2, 5, 6}
}
如果您将MyVals
设置为公共属性。当然,也可以通过构造函数(或数组)传入元素。
做了这样的事情
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>();
}
}