web-dev-qa-db-ja.com

C#が参照の返却をサポートしないのはなぜですか?

.NETは参照の戻りをサポートしていますが、C#はサポートしていません。特別な理由はありますか?次のようなことができない理由:

static ref int Max(ref int x, ref int y) 
{ 
  if (x > y) 
    return ref x; 
  else 
    return ref y; 
} 
139
Tom Sarduy

値型への参照を返すメソッドについて話している。私が知っているC#の唯一の組み込み例は、値型の配列アクセサーです:

public struct Point
{
    public int X { get; set; }
    public int Y { get; set; }
}

次に、その構造体の配列を作成します。

var points = new Point[10];
points[0].X = 1;
points[0].Y = 2;

この場合 points[0]、配列indexerは、structへの参照を返しています。これと同じ「参照を返す」動作を持つownインデクサー(たとえば、カスタムコレクション)を記述することはできません。

私はC#言語を設計しなかったので、C#言語をサポートしていない背後にあるすべての理由を知りませんが、短い答えは次のとおりだと思います。

22
Rick Sladkey

C#7.0は、参照を返す機能をサポートしています。私の答えをご覧ください こちら

1
CodingYoshi

あなたはいつも次のようなことをすることができます:

public delegate void MyByRefConsumer<T>(ref T val);

public void DoSomethingWithValueType(MyByRefConsumer<int> c)
{
        int x = 2;
        c(ref x);
        //Handle potentially changed x...
}
1
Eladian