无法使结构中的值类型在 c 中可变#

Not able to make the value types inside a structure as mutable in c#

提问人:Yogeswaran K 提问时间:2/27/2017 最后编辑:PiotrYogeswaran K 更新时间:3/1/2017 访问量:87

问:

我正在将 VB6 代码转换为 C#,在这里我必须将 struct 数组转换为 c# 中的 List 方法,但无法修改以下示例代码中的值,出现错误为 “无法修改 的返回值,因为它不是变量”。System.Collections.Generic.List<test.Program.TagFieldValue>.this[int]

我做错了什么..有没有其他方法可以在不将我的类型转换为类的情况下做到这一点?

using System;
using System.Collections.Generic;

namespace test
{
    class Program
    {
        private struct TagFieldValue
        {
            private int _ID;
            public int ID { get { return _ID; } set { _ID = value; } }
        }

        private List<TagFieldValue> mFieldValues = new List<TagFieldValue>();
        static void Main(string[] args)
        {
            Program obj = new Program();
            obj.test();
        }

        public void test()
        {
            for (int i = 1; i <= 10; i++)
            {
                TagFieldValue temp = new TagFieldValue();
                temp.ID = i;                
                mFieldValues.Add(temp);                
            }

            for (int i = 0; i <= 9; i++)
            {
                mFieldValues[i].ID = mFieldValues[i].ID + 10;
            }

            for (int i = 0; i <= 9; i++)
            {
                Console.WriteLine(mFieldValues[i].ID);
            }
            Console.ReadLine();
        }
    }
}
c# 数组列表 结构 可变 不可变集合

评论

0赞 Adam Houldsworth 2/27/2017
@john 不幸的是,这种评论并不准确。结构体并不是因为是结构体而不可变的(尽管大多数建议都说它们应该针对它们促进更好的编程风格),它们是值类型。在这种情况下,结构是可变的,但问题是副本被突变,然后立即装箱。

答:

2赞 Guy 2/27/2017 #1

Structs作为值传递,而不是引用。 将修改列表中的副本,而不是本身。若要修改列表中的值,需要创建新的mFieldValues[i].ID = mFieldValues[i].ID + 10;structTagFieldValue

for (int i = 0; i <= 9; i++)
{
    mFieldValues[i] = new TagFieldValue { ID = mFieldValues[i].ID + 10 };
}

或更改为TagFieldValueclass

private class TagFieldValue
{
    public int ID { get; set; }
}

评论

0赞 Adam Houldsworth 2/27/2017
这实际上是在各个点上获取结构的副本,但突出的情况是.创建新结构的替代方法,因为在这种情况下,结构不是不可变的,因此获取副本,进行更改,然后复制回数组:mFieldValues[i].ID = var s = mFieldValues[i]; s.ID = s.ID + 10; mFieldValues[i] = s;
0赞 Yogeswaran K 2/27/2017
当前的实现包含许多结构,其中大多数在 VB6 中用作结构数组,因此在这里我将它们在 C# 中制作为 List <mystructure> ..如果我开始将每个结构转换为类代码,则可读性会降低,维护将是一个问题,但同时,如上所述,每次在许多地方编辑值看起来也不好。请就此提出一些建议。
0赞 Adam Houldsworth 2/27/2017
@user3816092 不完全确定你认为它的可读性和可维护性会降低 - 这些不是类的负面品质,只是糟糕的代码。
0赞 Pepijn Bakker 3/1/2017 #2

结构不是那么灵活。也无法定义输入,因此如果要执行此操作,则应改用类。我遇到了类似的问题,将其更改为类不会出现任何问题。