在方法中赋值到结构数组在 C# 中不起作用

本文关键字:不起作用 数组 方法 赋值 结构 | 更新日期: 2023-09-27 17:55:26

这是我的LinqPad中的代码片段:

public class Elephant{
    public int Size;
    public Elephant()
    {
        Size = 1;
    }
}
public struct Ant{
    public int Size;
}
private  T[]  Transform2AnotherType<T>(Elephant[] elephantList)
          where T:new()
{
        dynamic tArray = new T[elephantList.Length];
        for (int i = 0; i < elephantList.Length; i++)
        {
            tArray[i] = new T();
            tArray[i].Size = 100;
                    //tArray[i].Dump();
        }
     return tArray;
}
void Main()
{
    var elephantList = new Elephant[2];
    var elephant1 = new Elephant();
    var elephant2 = new Elephant();
    elephantList[0] = elephant1;
    elephantList[1] = elephant2;
    elephantList.Dump();
    var r = Transform2AnotherType<Ant>(elephantList);
    r.Dump();
}

我想将一个已知类型的对象数组Elephant更改为另一个类型为 T 的对象数组.T 不是class,但仅限于 struct由已经存在的 API 提供。T型的每个实例都共享一些公共属性,Size说,但也具有自己的特定属性,我在示例代码中省略了。所以我把dynamic关键字放在Transform2AnotherType<T>内。而且我什至无法使用 Dump 来确定分配是否生效,因此会抛出RuntimeBinderException

我的问题是:如何在这样的结构数组中正确进行赋值并将其正确返回?

在方法中赋值到结构数组在 C# 中不起作用

我建议像这样更改您的代码:

public class Elephant 
    {
        public Elephant()
        {
            Size = 1;
        }
        public int Size { get; set; }
    }
    public struct Ant 
    {
        public int Size { get; set; }
    }
    private static T[] Transform2AnotherType<T>(Elephant[] elephantList)
              where T : new()
    {
        T[] tArray = new T[elephantList.Length];
        for (int i = 0; i < elephantList.Length; i++)
        {
            dynamic arrayElement = new T();
            arrayElement.Size = 100;
            tArray[i] = arrayElement;
            //tArray[i].Dump();
        }
        return tArray;
    }
    static void Main()
    {

        var elephantList = new Elephant[2];
        var elephant1 = new Elephant();
        var elephant2 = new Elephant();
        elephantList[0] = elephant1;
        elephantList[1] = elephant2;
        //elephantList.Dump();
        var r = Transform2AnotherType<Ant>(elephantList);
        //r.Dump();
    }