.NETは参照の戻りをサポートしていますが、C#はサポートしていません。特別な理由はありますか?次のようなことができない理由:
static ref int Max(ref int x, ref int y)
{
if (x > y)
return ref x;
else
return ref y;
}
値型への参照を返すメソッドについて話している。私が知っている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#言語をサポートしていない背後にあるすべての理由を知りませんが、短い答えは次のとおりだと思います。
C#7.0は、参照を返す機能をサポートしています。私の答えをご覧ください こちら 。
あなたはいつも次のようなことをすることができます:
public delegate void MyByRefConsumer<T>(ref T val);
public void DoSomethingWithValueType(MyByRefConsumer<int> c)
{
int x = 2;
c(ref x);
//Handle potentially changed x...
}