C# 如何通过引用访问集合中的值类型?

C# 如何通过引用访问集合中的值类型?,c#,collections,value-type,C#,Collections,Value Type,是否存在通过引用而不是通过值从值类型集合中获取值类型的方法,类似于通过引用将值类型传递给方法的方法 var myInts = new List<int> { 1, 2, 3 }; var item1 = myInts[0]; item1 += 23; Console.WriteLine(myInts[0]); // ouputs: 1 myInts[0] += 987; Console.WriteLine(myInts[0]); // outputs: 988 var myInts

是否存在通过引用而不是通过值从值类型集合中获取值类型的方法,类似于通过引用将值类型传递给方法的方法

var myInts = new List<int> { 1, 2, 3 };
var item1 = myInts[0];
item1 += 23;
Console.WriteLine(myInts[0]);
// ouputs: 1
myInts[0] += 987;
Console.WriteLine(myInts[0]);
// outputs: 988
var myInts=新列表{1,2,3};
var item1=myInts[0];
项目1+=23;
Console.WriteLine(myInts[0]);
//输出:1
myInts[0]+=987;
Console.WriteLine(myInts[0]);
//产出:988
因此,对
item1
变量的修改也将修改集合中的元素


使用索引器的工作原理如上所述,因为我在获取元素后正在重新分配它。

据我所知,这是不可能的

当你写作时

var item1 = myInts[0];
存储在名为
myInts
的列表中索引为0的位置的值被分配给item1变量。由于此列表是一个值类型列表,因此分配给
item1
的值是零位置元素的实际值,它与
myInts
保存引用类型实例的情况不同。因此,对分配给
item1
的值的任何修改都不会导致对元素
myInts[0]
的修改


事实上,我看不出你问的这样的问题有什么用处。如果您能为我们指出一个有益的用例,我将不胜感激

不,那是不可能的

如果你问的是
Int32
,答案是否定的。如果它是你自己的结构,你可以通过“接口”来实现


这是因为
myInts
包含将通过引用复制的装箱结构列表。

您可以对lambdas进行一些小技巧,以获得可能按您希望的方式工作的内容

因此,如果您乐于传递对
操作的引用,您可以更新集合的元素

因此:

var myInts = new List<int> { 1, 2, 3 };
这将更新集合的元素,而不传递集合

试着这样做:

Action<Func<int, int>> updateItem1 = f => myInts[0] = f(myInts[0]);
updateItem1(x => x + 23);
updateItem1(x => x + 987);
var myInts = new List<int> { 1, 2, 3 };

Action<Func<int, int>> updateItem1 =
    f => myInts[0] = f(myInts[0]);

updateItem1(x => x + 23);
Console.WriteLine(myInts[0]); // 24
updateItem1(x => x + 987);
Console.WriteLine(myInts[0]); // 1011
var myInts=新列表{1,2,3};
动作更新项1=
f=>myInts[0]=f(myInts[0]);
updateItem1(x=>x+23);
Console.WriteLine(myInts[0]);//24
updateItem1(x=>x+987);
Console.WriteLine(myInts[0]);//1011

有点不一致,
myInts[0]+=987
起作用,我不是在抱怨。我陷入了一个
for
循环中,修改一个变量,以为它会在集合中更新-但这只是我的错-这确实意味着我现在每次在
for
循环中修改它或在相同位置重新分配元素时都必须使用索引器。实际上我现在意识到
myInts[0]+=987
有效,因为我正在重新分配该位置的元素。请不要在问题标题中包含有关所用语言的信息,除非没有它就没有意义。标记就是为了这个目的。@OndrejJanacek好的,我更改了我的标题,虽然是因为你更改了问题-我不想访问一个对象,即框中的值。我知道你不想,但这就是它的名称。您不访问值类型,而是访问值类型的对象。此上下文中的对象不是指引用类型的对象,而是指集合或工作项的条目。“值类型”不应理解为某个变量,而应理解为一般类型(int、double等)。是的,我意识到我可以将值装箱-我可能只使用类而不是带接口的结构。@markmnl是的,老实说,类是更好的选择。但是,如果你对结构感兴趣,这种技术会有所帮助。
updateItem1(x => x + 23);
updateItem1(x => x + 987);
var myInts = new List<int> { 1, 2, 3 };

Action<Func<int, int>> updateItem1 =
    f => myInts[0] = f(myInts[0]);

updateItem1(x => x + 23);
Console.WriteLine(myInts[0]); // 24
updateItem1(x => x + 987);
Console.WriteLine(myInts[0]); // 1011