代码是:
struct m1
{
public int a;
public int b;
}
int main()
{
List <m1> mList;
m1.initialize;
//new. and add some items to it.
Run Code Online (Sandbox Code Playgroud)
现在我想在mList中访问对象,我试过:
for each(m1 it in mList)
{
m1.a = 5;
}
Run Code Online (Sandbox Code Playgroud)
但它失败了.因为每次我在控制台上写了m1.first().a.这是它的初始值不是5.
然后我试了
for (int counter = 0; counter < mList.size(); counter++)
{
m1 it = mList[counter];
it.a = 5;
}
Run Code Online (Sandbox Code Playgroud)
再次出现同样的问题.
然后我试了
for (int counter = 0; counter < mList.size(); counter++)
{
mList[counter].a = 5;
}
Run Code Online (Sandbox Code Playgroud)
它甚至没有编译.它给了我一个错误.它说的是关于list.this [int]的不可修改的返回值.
然后我试了
for (int counter = 0; counter < mList.size(); counter++)
{
var m1 it = mList[counter];
it.a = 5;
}
Run Code Online (Sandbox Code Playgroud)
它也没用.我尽我所能,以及我在互联网和本网站上发现的一切.你能帮忙找到一种方法来访问列表中对象(类型为struct)的参数吗?显然,当列表来自对象(来自类)时,它很容易.如果我想从结构对象中创建一个列表,那就会出现复杂化.任何帮助都会受到欢迎.
Jon*_*eet 10
问题是你在一个列表中放了一个结构.当你从列表中获取它时,它将创建一个副本 - 所以修改它将没有任何好处.鉴于您的意见,您可能会对C#中值类型和引用类型的工作方式感到困惑,在这种情况下,我建议您阅读有关该主题(或书籍或MSDN等)的文章.
您需要获取它,修改副本,然后替换列表中的值:
var copy = list[index];
copy.a = 5;
list[index] = copy;
Run Code Online (Sandbox Code Playgroud)
但是,我强烈建议不要首先创建可变值类型,部分原因是它们确实导致了这类问题.值类型通常应该用于更多"基本"值,这些值不能在适当的位置更改.改变"数字5"的含义是没有意义的,例如,"1月1日上午10点".如果你改变了意思,你就会得到一个新的价值 - 所以强迫它真正成为一个新的价值.
目前还不清楚(由于缺乏上下文)您是应该创建不可变值类型并将其替换为列表,还是创建可变引用类型(类).或者甚至可能是不可变的引用类型,因为它通常有助于提高可读性.
我还建议不要使用公共字段 - 而是使用属性来将实现细节与类型的API分开.