是否可以重载“数组赋值”?对于自定义结构体

本文关键字:结构体 自定义 数组赋值 赋值 重载 数组 是否 | 更新日期: 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>();
    }
}