7

リストオブジェクトを直接参照せずに、リストオブジェクトに値を割り当てられるようにしたいと思います。

疑似例:

List<int> intList = new List<int> { 0 };
???? intPointer = ref intlist[0];

*intPointer = 1;  // I know * isn't possible here, but it is what I'd like to do

Console.WriteLine(intList[0]);

そしてそれは出力します1

これは不可能だと思っていますが、何かを見逃していないことを確認したかっただけです。

また、を使用する例を探していませんunsafe。これがマネージコードで可能かどうか知りたいです。

4

3 に答える 3

12

C#には「reflocals」の概念がありません(CLRにはあります)。したがって、変更可能な参照型で値をラップする必要があります。例えば、

public class Ref<T> where T : struct
{
    public T Value {get; set;}
}

List<Ref<int>> intRefList = new List<Ref<int>>();
var myIntRef = new Ref<int> { Value = 1 };
intRefList.Add(myIntRef);

Console.WriteLine(myIntRef.Value);//1

Console.WriteLine(intRefList[0].Value);//1

myIntRef.Value = 2;

Console.WriteLine(intRefList[0].Value);//2

編集:C#7.0はref localsを追加しましたが、ref localsを配列またはリストに配置できないため、この方法では使用できません。

于 2012-11-14T00:54:04.093 に答える
4

いいえ、これはC#では不可能です。

C#は、ローカルコンテナーの要素への参照を含む、ローカル変数への参照をサポートしていません。

C#で真の参照(つまり、参照型のインスタンスではなく、別の変数への実際の参照)を取得する唯一の方法は、refまたはoutパラメーターキーワードを使用することです。これらのキーワードは、の要素を含む、あらゆる種類のインデックス付きの値またはプロパティと一緒に使用することはできませんList<>。また、これらの参照を直接制御することはできません。コンパイラは、バックグラウンドで逆参照を実行します。

興味深いことに、CLRこの種の参照をサポートしています。CILをC#に逆コンパイルすると、そのような型int&が参照されることがありますint。C#では、これらの型をコードで直接使用することは意図的に許可されていません。

于 2012-11-14T00:55:05.593 に答える
0

intなどの値型を使用する場合、要求していることは不可能です。追加レベルの間接参照が必要になります。たとえば、整数をラップすることができます。

その例については、イテレータに渡す値型の可変ラッパーを参照してください。

于 2012-11-14T00:53:16.727 に答える