4

曲線を描くための(学校)アプリケーションを作成しています。マウスをクリックしてポイントを設定し、それらの位置を頂点のリストに追加します。現在、マウスダウンとマウスアップのアクションを使用してポイントを移動しています。マウスを下げると、マウスの位置が頂点のリスト内の頂点の周りの小さな正方形 (4x4 ピクセル) にあるかどうかを確認し、マウスを上げると、頂点の座標をマウスボタンを上げた座標に変更したいと考えています。Listしかし、 Visual Studio は、変数ではないため、リスト項目を変更できなかったと言う原因で問題にぶつかりました。どうすればこれを解決できますか?

List<Point> vertices = new List<Point>(); //list of vertices
void canvas_MouseUp(object sender, MouseEventArgs e) {
    if (!move) return; //if moving is off returns
    vertices[indexOfMoved].X = e.X; //change X position to new position
    vertices[indexOfMoved].Y = e.Y; //change Y position to new position
    indexOfMovedLabel.Text = "Moved: ?";
}

問題:

エラー 1 'System.Collections.Generic.List.this[int]' は変数ではないため、戻り値を変更できません

4

2 に答える 2

7

これは、Pointがオブジェクトではなく構造体であるためです。構造体はグループ化された値と考えることができます。

したがって、vertices[indexOfMoved] にアクセスすると、実際の「オブジェクト」ではなく、リストにあるもののコピーが取得されます。

次のように実行できます。

vertices[indexOfMoved] = new Point { X = e.X, Y = e.Y };
于 2012-05-24T13:36:18.273 に答える
2

Point は構造体であるため、この値を変更することはできません。詳細を説明する前に。関数を次のように変更する必要があります。

private void canvas_MouseUp(object sender, MouseEventArgs e)
{
    if (!move) return; //if moving is off returns
    Point p = vertices[indexOfMoved];
    p.X = e.X;
    p.Y = e.Y;
    vertices[indexOfMoved] = p;            
    indexOfMovedLabel.Text = "Moved: ?";
}

これは、構造体を使用しているために発生します。コンパイラが警告を出さなかった場合、新しい構造体がスタックに作成され、スタック内の構造体に変更が加えられます。リスト内の構造体には影響しません。これを防ぐために、コンパイラは警告を出します。

于 2012-05-24T13:39:59.577 に答える