【问题标题】:C# error CS0266: Cannot implicitly convert type 'System.Array' [duplicate]C# 错误 CS0266:无法隐式转换类型“System.Array”[重复]
【发布时间】:2021-07-23 16:45:31
【问题描述】:

我想创建一个函数来动态分配数组成员元素。数组的大小不同,它们来自文件。 我使用反射从 struct 对象中获取数组成员元素,并将其分配给从 Array.CreateInstance() 函数创建的新数组。

private static void initArray<T>(ref T item, BinaryReader br){
var fields = item.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
//....
// get array field from object
//...
 arrayType = arrayFieldInfo.FiledType;
 int length = br.ReadInt32();
 Array arr = Activator.CreateInstance(arrayType, length) as Array;
 arrayFieldInfo.SetValue(item, arr); // this code not work
}

我发现这个函数不能工作,因为这个错误:错误CS0266:不能隐式转换类型'System.Array'。请帮帮我。

---更新---- 我把示例代码放在这里

struct Person
{
    public Address[] addresses;
}

struct Address
{
    public int nCode;
    public string homeAddress;
}
class Program
{
    static void Main(string[] args)
    {
        Person p = new Person();
        int nSize = 100;//hard code instead of read from file
        var fields = typeof(Person).GetFields(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);

        foreach (var fieldInfo in fields)
        {
            if (fieldInfo.FieldType.IsArray)
            {
                Array arr = Array.CreateInstance(fieldInfo.FieldType.GetElementType(), nSize);

                //1. Using reflection to set value
                fieldInfo.SetValue(p, arr);

                if(p.addresses == null)
                {
                    Console.WriteLine("Reflection-Not success");
                }
                else
                {
                    Console.WriteLine("Reflection-success");
                }

                //2. Using assignment operator with explicit cast

                p.addresses = (Address[])arr;

                if (p.addresses == null)
                {
                    Console.WriteLine("cast-Not success");
                }
                else
                {
                    Console.WriteLine("cast-Success!!");
                }
            }
        }
    }
}

【问题讨论】:

  • 请添加您如何获得arrayFieldInfo 的代码以及您的方法失败的类型。目前不能reproduce
  • 您发布的代码不会引发您声称的异常。但是,它确实 具有经典的“通过反射设置结构字段”错误,您正在对原始值的盒装 副本 进行操作,因此该字段的值在原值不变。查看副本。

标签: c# reflection


【解决方案1】:

在我看来,'arrayFieldInfo' 代表一个类型不是 Array 且不能从 Array 隐式转换的字段。我建议验证分配变量的字段。这可以通过在 SetValue() 调用之前插入以下代码来完成。然后,信息应该会在运行时出现在控制台输出中。

System.Diagnostics.Debug.WriteLine(arrayFieldInfo.ToString());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    • 2014-02-12
    相关资源
    最近更新 更多