你不能。
您仍然可以就地编辑元素,但只能直接分配给它们:
vars[2] += 42;
但我刚刚测试了这个作品:
using System;
public class Test
{
private static void assign(ref int i)
{
i = 42;
}
public static void Main()
{
var vars = new [] { 1,2,3,4 };
Console.WriteLine(vars[2]);
assign(ref vars[2]);
Console.WriteLine(vars[2]);
}
}
See it 直播 http://ideone.com/fz36y http://ideone.com/fz36y
Output
3
42
更新:包装器
作为一种心理练习,我想出了这种病态和扭曲的机制来仍然得到你想要的东西(但比简单地装箱所有整数的成本更高):
private class Wrap<T> where T : struct
{
public T Value;
public static implicit operator Wrap<T>(T v) { return new Wrap<T> { Value = v }; }
public static implicit operator T(Wrap<T> w) { return w.Value; }
public override string ToString() { return Value.ToString(); }
public override int GetHashCode() { return Value.GetHashCode(); }
// TODO other delegating operators/overloads
}
Now, a Wrap<int>
其行为大致与常规 int 相同(在比较、相等和运算符领域需要更多工作)。您可以使用它来编写此内容,并让它按照您想要的方式工作:
private static void assign(ref int i)
{
i = 42;
}
public static void Main()
{
Wrap<int> element = 7;
var vars = new Wrap<int>[] {1, 2, element, 3, 4};
Console.WriteLine(vars[2]);
assign(ref vars[2].Value);
Console.WriteLine(element);
Console.ReadKey();
}
Output:
7
42
See it 也直播:http://ideone.com/b0m7T http://ideone.com/b0m7T