C# 无法使结构中的值类型在c中可变#
我正在将VB6代码转换为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
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;istruct
作为值传递,而不是引用。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遗憾的是,该注释不准确。结构不是因为是结构而不变的(尽管大多数建议说它们应该是针对它们促进更好的编程风格),但它们是值类型。在这种情况下,结构是可变的,但问题是一个副本正在发生变异,然后立即被装箱。