2012-04-13 56 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

大家都很快指出,擴展方法必須是靜態的。

當我試圖重現你的錯誤時,我得到了一個編譯器錯誤「擴展方法必須是靜態的」,所以你覺得你的代碼編譯報告似乎很奇怪。當您嘗試編譯它時,請查看錯誤列表以查看它是否實際上爲空。我懷疑你會發現一個你以前沒有注意到的錯誤信息。如果您能夠看到編譯器錯誤,那麼這種性質的錯誤將很容易識別和修復。