コンパイラエラー '変数ではないため式を変更できません'が表示されます。構造体のコピーが返されるので、structプロパティに値を代入することはできませんが、この場合は当てはまりません。構造体インデクサに値を代入する
私は2つの配列を同期させておくことを目的としたDualArrayクラスを持っています。 Aプロパティを使用して「最初の」配列の項目にアクセスし、Bのプロパティを使用して「2番目の」配列に項目をアクセスしたいとします。これらのプロパティは、それぞれの配列にインデクサを持つ構造体を返します。
public struct Accessor<T>
{
private readonly T[] _array;
public Accessor(T[] array)
{ _array = array; }
public T this[int index]
{
get { return _array[index]; }
set { _array[index] = value; }
}
}
/// <summary>
/// Maintains two arrays.
/// </summary>
public class DualArray<T1, T2>
{
// ...
public Accessor<T1> A
{
get { return new Accessor<T1>(_arrayT1); }
}
public Accessor<T2> B
{
get { return new Accessor<T2>(_arrayT2); }
}
// ...
}
私はこのコードを使用しようとする今、私はエラーを取得:
DualArray<int, bool> dual = new DualArray<int, bool>();
// ...
dual.A[5] = 2; // <-- sad trombone.
私はクラスに私のアクセサー・タイプを変更すると、それはすべて正常に動作しますが、確実に構造体がコピーされても関連する配列への参照はまだ有効ですか?あるいは、実際のエラーではなく、私がしてはいけないことをやっているので、この場合のエラーですか?
ありがとう、私はそれがおそらくそれほど重大なものだからといって、おそらくエラーとして偽装している警告であると考えました。ソリューションを恥ずかしく思うと、名前の付いたアクセサーを持つことの正体が破壊されます。私はアクセサーを参照タイプに変更しました。これにより、簡潔な割り当てを保つことができます。 –
@DavidRutten:「エラーになりすます」という警告ではありません。エラーです。表現「dual.A」は変数ではなく値として分類されます。したがって、インデクサ設定ツールを使用することはできません。 *これを許可したコンパイラは、言語仕様に違反しています。 –
@JonSkeet、私はそれが実際には無意味ではなく、そのように定義されているので、エラーです。十分に公正な、私は仕様デザイナーが芽の中にそのような危険なコードを挟むことが重要だと感じた理由を理解する。 –