Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法使结构中的值类型在c中可变#_C#_Arraylist_Struct_Mutable_Immutable Collections - Fatal编程技术网

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

C# 无法使结构中的值类型在c中可变#,c#,arraylist,struct,mutable,immutable-collections,C#,Arraylist,Struct,Mutable,Immutable Collections,我正在将VB6代码转换为C#这里我必须将C#中的结构数组转换为列表方法,但无法修改下面示例代码中的值,错误如下 “无法修改System.Collections.Generic.List.this[int]的返回值,因为它不是变量。” 我做错了什么。。在不将我的类型转换为类的情况下,还有其他方法吗 using System; using System.Collections.Generic; namespace test { class Program { pri

我正在将VB6代码转换为C#这里我必须将C#中的结构数组转换为列表方法,但无法修改下面示例代码中的值,错误如下 “无法修改
System.Collections.Generic.List.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();
        }
    }
}
使用系统;
使用System.Collections.Generic;
名称空间测试
{
班级计划
{
私有结构TagFieldValue
{
私人内部ID;
公共int-ID{get{return{u-ID;}set{{u-ID=value;}}
}
私有列表mFieldValues=新列表();
静态void Main(字符串[]参数)
{
Program obj=新程序();
obj.test();
}
公开无效测试()
{

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

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

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

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

结构没有那么灵活。输入也不能定义,所以如果你想这样做,你应该用类来代替。我有一个类似的问题,把它改成类并没有任何问题。

结构没有那么灵活。输入也不能定义,所以如果你想这样做,你应该用类来代替。我有一个lar问题并将其更改为类不会带来任何问题。

这实际上是在不同点复制结构,但突出的情况是
mFieldValues[i].ID=
。创建新结构的另一种方法是获取一个副本,进行更改,然后复制回数组:
var s=mFieldValues[i];s.ID=s.ID+10;mFieldValues[i]=s;
当前的实现包含许多结构,其中大多数在VB6中用作结构数组,因此我在C#as列表中创建了它们。如果我开始将每个结构转换为类代码,则可读性将降低,维护将是一个问题,但同时每次在许多地方编辑值,如上面的代码看起来也不太好。请对此给出一些建议。@user3816092不完全确定您认为它的可读性和可维护性会如何降低-这些不是类的负面特性,只是糟糕的代码。这实际上是在不同点复制结构,但突出的情况是
mFieldValues[i].ID=
。创建新结构的另一种方法是获取一个副本,进行更改,然后复制回数组:
var s=mFieldValues[i];s.ID=s.ID+10;mFieldValues[i]=s;
当前的实现包含许多结构,其中大多数在VB6中用作结构数组,因此我在C#as列表中创建了它们。如果我开始将每个结构转换为类代码,则可读性将降低,维护将是一个问题,但同时每次在许多地方编辑值,如上面的注释看起来也不太好。请对此给出一些建议。@user3816092不完全确定您认为它的可读性和可维护性会如何降低-这些不是类的负面特性,只是糟糕的代码。@john遗憾的是,该注释不准确。结构并不是因为是结构而不变的(尽管大多数建议都说应该推广更好的编程风格),但它们是值类型。在本例中,结构是可变的,但问题是一个副本正在发生变异,然后立即被装箱。@john遗憾的是,该注释不准确。结构不是因为是结构而不变的(尽管大多数建议说它们应该是针对它们促进更好的编程风格),但它们是值类型。在这种情况下,结构是可变的,但问题是一个副本正在发生变异,然后立即被装箱。