2013-07-03 41 views
0

我的問題是一半風格,一半功能。我正在重寫一個庫,並儘可能地壓縮它。 (它需要一個路徑並讀取值到一個爲ByRef變量)。以前它是這樣的:用泛型高效重載

Public Sub Read(ByVal name As String, ByRef values(,) As Integer)

Public Sub Read(ByVal name As String, ByRef values(,,) As Long)

等等...有關於這些,包括標版本。噩夢更新。

每種方法都按類型和級別超載。我正在用泛型重做這個系統,但我遇到了一個問題。下面的方法將不能編譯:

Public Sub Read(Of T)(ByVal name as String, ByRef values As T)

Public Sub Read(Of T)(ByVal name as String, ByRef values As T())

Public Sub Read(Of T)(ByVal name as String, ByRef values As T(,))

Public Sub Read(Of T)(ByVal name as String, ByRef values As T(,,))

爲什麼不能編譯,這是相當明顯的;類型'T'很容易被認爲是一個數組,編譯器不知道是選擇第一個還是第二個重載。 (注意:如果不是是過載讀取方法的標量版本,則此係統按預期工作。)

所以,我剩下一個難題。我不知道設計這些重載的最佳方式,所以我使用最少的代碼,同時保持與使用此庫的現有代碼的向後兼容性。 (我們嚴格使用它,所以我可以更改任何代碼使用我的庫,但我寧願保持簽名儘可能相同。)

基本上,有沒有辦法設計我的重載,就像我所顯示的那樣?我可以明確地告訴編譯器,我希望頂級重載只能用於標量輸入嗎?如果不是,最好的設計是什麼?我願意接受任何創意。

感謝

+0

奇怪的是,在具有'.NET 3.5'的'C#'中,這不是一個問題,編譯和運行沒有問題。無論如何,請嘗試按照以下答案進行操作。 –

回答

0

有一兩件事你可以嘗試就是讓你先過載只拿結構(如果你在你的情況下,僅使用數字值)。

Public Sub Read(Of T As Structure)(ByVal name as String, ByRef values As T) 

也許這可以做重載選擇,因爲數組不是結構。

另一件要做的事情,有點醜陋的是,使用不同的名稱對所有數組進行重載,並使用自己的名稱進行標量。 在標量版本中,您檢查是否T is Array,計算它的尺寸並調用propper數組過載。