2012-04-13 57 views
1

我想写一个通用的扩展方法,将一个固定矩阵添加到“弹性”矩阵。扩展方法编译和(我认为)它的代码在常规方法中工作正常。知道我将使用这个功能很多各种类型,我更希望算出这个问题出来了,而不是用创可贴一起一瘸一拐:C#通用扩展方法编译但不可用?

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? 
    } 
+0

当你去使用它时会发生什么? – 2012-04-13 18:22:15

回答

4

MSDN

定义和调用扩展方法

  1. 定义一个静态类以包含扩展方法。该类必须对客户端代码可见。

  2. 将扩展方法实现为静态方法,并且与包含类具有至少相同的可见性。

  3. 该方法的第一个参数指定该方法操作的类型;它必须以此修饰符开头。

你的方法不是静态的(2)。

+0

标记为包含扩展方法的所有必要要求是正确的。我做了很多方法,但是我猜测我做这个的时候我完全有脑屁! – 2012-04-13 18:34:48

1

你正在写一个扩展方法,AddMatrix<T>需求是静态的。

+0

+1为正确,但我只能标记一个正确的答案。感谢您花时间回答我的问题。 – 2012-04-13 18:38:52

1

扩展方法必须是静态的。

+0

+1是正确的,我只能标记一个正确的答案,但我希望你知道我很欣赏你花时间回答我的问题。 – 2012-04-13 18:38:26

1

扩展方法必须是静态的。

将其更改为: 公共静态无效AddMatrix(名单MYLIST,T [,]矩阵)

,并确保类是静态的了。

+0

感谢您回答我的问题! – 2012-04-13 18:39:17

1

大家都很快指出,扩展方法必须是静态的。

当我试图重现你的错误时,我得到了一个编译器错误“扩展方法必须是静态的”,所以你觉得你的代码编译报告似乎很奇怪。当您尝试编译它时,请查看错误列表以查看它是否实际上为空。我怀疑你会发现一个你以前没有注意到的错误信息。如果您能够看到编译器错误,那么这种性质的错误将很容易识别和修复。