2

今まで、このサイトの既存の投稿から常に回答を得ることができましたが、今日は誰も質問していないように思われる質問があります。

次のコードについてです。

class Board<T>
{
    private T[,] board;

    public T[,] BoardArray
    {
        get { return (T[,])board.Clone(); }
    }

    public T this[int y, int x]
    {
        get { return board[y, x]; }
        set { board[y, x] = value; }
    }

    public Board()
    {
        board = new T[8, 8];
    }

    public void AssignToBoard()
    {
        board[1, 2] = 3;
        this[1, 2] = 3;
    }
}

問題は、メソッドの両方のコード行が同じコンパイル時エラーを生成することです。エラーがスローされる理由はわかっていますが、明確な回避策はわかりません。これはエラーです:

Error   1   Cannot implicitly convert type 'int' to 'T' C:\Users\Peter\Desktop\Dropbox\ReversieAI\ReversieAI\ReversieAI\Map.cs  31  18  ReversieAI

コードをコンパイルできる唯一の方法は、行を次のように変更することです。

board[1, 2] = (T)(object)3;
this[1, 2] = (T)(object)3;

機能しますが、それでもまだ汚いソリューションです。問題を認識していて、私を助けたり、考えを共有したりできる人はいますか?

前もって感謝します、ピーター

編集:クラスの一般的な部分を削除するアーキテクチャで何かを変更することで解決策を見つけました。フィードバックをお寄せいただきありがとうございます。ほんとうにありがとう。

4

2 に答える 2

3

問題は、AssignToBoard メソッドで、整数を s を含む配列に入れることTであると想定していることにあるようです。intT

私は通常、次のようなものを期待します:

public void AssignToBoard(T value)
{
    board[1, 2] = value;
    this[1, 2] = value;
}

Tこれでは、割り当てられている正しいタイプ ( ) の値を渡しています。

次に、次のような他の場所で何かを行うことができます。

var myboard = new Board<int>();
myboard.AssignToBoard(3);

追加の注意として、(T)(object)3T が文字列のようなものであり、実行時に変換できない場合、使用するソリューションは実行時に失敗する可能性があります。あなたは本当にコンパイル時から実行時まで問題をプッシュしているだけです...

于 2012-07-03T16:28:15.593 に答える
1

AssignToBoard はジェネリックではありませんが、ボードはジェネリックです。

テスト関数としてボードの外に移動するつもりですか。その場合、Board を作成して使用することになり、すべてが正常に機能します。

テストするには、次のように AssignToBoard を使用します

public void AssignToBoard()
{
    Board<int> testBoard = new Board<int>();
    testBoard[1, 2] = 3;
}
于 2012-07-03T16:27:53.447 に答える