1

「弾性」行列に固定行列を追加するための一般的な拡張メソッドを作成しようとしています。拡張メソッドはコンパイルされ、そのコードは通常のメソッドで正常に機能すると思います。この関数をさまざまなタイプで頻繁に使用することを知っているので、バンドエイドと一緒に足を引きずるよりも、この問題を理解したいと思います。

    public void AddMatrix<T>(this List<T[]> MyList, T[,] Matrix)
    {
        if (MyList == null) throw new ArgumentNullException("MyList");
        if (Matrix == null) throw new ArgumentNullException("Matrix");

        for (int i = 0; i < Matrix.GetLength(0); i++)
        {
            T[] aLine = new T[Matrix.GetLength(1)];
            for (int j = 0; j < Matrix.GetLength(1); j++)
                aLine[j] = Matrix[i, j];
            MyList.Add(aLine);
        }
    }
    public void testAddMatrix()
    {
        List<string[]> aMyBigMatrix = new List<string[]>();
        string[,] aSmallerMatrix = 
        {
        {
            "foo",
            "bar", 
            "what"
        }
        };

        aMyBigMatrix.AddMatrix(aSmallerMatrix);               // .AddMatrix is not showing up here in Intellisense?
    }
4

5 に答える 5

4

MSDNから:

拡張メソッドを定義して呼び出すには

  1. 拡張メソッドを含む静的クラスを定義します。クラスはクライアントコードから見える必要があります。

  2. 拡張メソッドを、少なくともそれを含むクラスと同じ可視性を持つ静的メソッドとして実装します。

  3. メソッドの最初のパラメーターは、メソッドが操作するタイプを指定します。この修飾子を前に付ける必要があります。

メソッドは静的ではありません(2.)。

于 2012-04-13T18:23:10.300 に答える
1

誰もがすぐに指摘するように、拡張メソッドは静的でなければなりません。

エラーを複製しようとすると、「拡張メソッドは静的である必要があります」というコンパイラエラーが発生したため、コードがコンパイルされたと報告するのは奇妙に思えます。コンパイルしようとするときは、エラーリストを見て、実際に空であるかどうかを確認してください。今まで気づかなかったエラーメッセージが表示されるのではないかと思います。コンパイラのエラーを確認できれば、この種の間違いを簡単に特定して修正できます。

于 2012-04-13T18:33:21.563 に答える
1

あなたは拡張メソッドを書いていAddMatrix<T>ます、静的である必要があります。

于 2012-04-13T18:23:01.013 に答える
1

拡張メソッドは静的である必要があります。

于 2012-04-13T18:24:14.210 に答える
1

拡張メソッドは静的でなければなりません。

次のように変更します:public static void AddMatrix(this List MyList、T [、] Matrix)

また、クラスも静的であることを確認してください。

于 2012-04-13T18:24:14.460 に答える