滾動到底部,編輯19向前。見@克里斯的評論也是很好的例子具有泛型委託的可空(Guid)導致奇怪(隱藏)錯誤?
VB:
Public Class Class1
Private Delegate Sub AnEventHandler(Of T)(ByVal newValue As T)
Private Event OnSomething As AnEventHandler(Of Nullable(Of Guid))
End Class
C#:
public class Class1
{
private delegate void AnEventHandler<T>(T newValue);
private event AnEventHandler<Nullable<Guid>> OnSomething;
}
隨着.NET3.5和.Net 4上面的VB代碼,Visual Studio 2008和2010,無論項目類型如何,您都會收到以下錯誤:
未定義類型「Global.System.Guid」。
您無法通過雙擊導航到錯誤,並且沒有給出行/色號碼。
做不是來自here的報價: 「T」只能是一個類,一個接口或一個類型參數。
...因爲那是錯誤,如下所述。
爲了證實這一說法,一對夫婦的事實
Nullable是一個結構。但是,下面的編譯:
Public Class Class1
Private Delegate Sub AnEventHandler(Of T)(ByVal newValue As T)
Private Event OnSomething As AnEventHandler(Of Nullable(Of Integer))
End Class
您可以使用可空的GUID如下所示:
Private Sub StackOverflowTest()
Dim s As Nullable(Of Guid)
If s.HasValue Then
'Do something
End If
End Sub
該代碼編譯和工作方式你可能想象。即使下面的代碼使用泛型和可空的GUID工作!
Private Sub StackOverflowTest2(Of T)()
' do stuff
End Sub
Private Sub StackOverflowTest3()
StackOverflowTest2(Of Nullable(Of Guid))()
End Sub
但是,我列在頂部的特定示例不起作用。爲什麼?顯然,T 確實使用結構...
編輯19! = d
- 創建VB.Net控制檯應用程序
以下內容添加到「模塊1。VB」
模塊模塊1
Sub Main() Dim testCase1 As Nullable(Of Integer) testCase1 = 2190 StackOverflowTest1(Of Nullable(Of Integer))(testCase1) Dim testCase2 As Nullable(Of Guid) testCase2 = Guid.NewGuid StackOverflowTest1(Of Nullable(Of Guid))(testCase2) Dim testCase3 As Nullable(Of Guid) testCase3 = Nothing StackOverflowTest1(Of Nullable(Of Guid))(testCase3) End Sub Private Sub StackOverflowTest1(Of T)(ByVal param As T) Console.WriteLine(param.ToString) End Sub
前端模塊
結果:
5ef4ed7c-2720-4b37-b8ca-4ac044ec70d0
< < <這裏就沒有什麼只給回車
最後的編輯(我希望):
這一切都趨於平靜,因爲編輯19ish和@克里斯加強問題有一個很好的例子(謝謝你,克里斯) 。我會讓問題更簡單一些(並嘗試整理上述所有內容),任何人都可以證明這不是MS錯誤或類似錯誤?它似乎是在引擎蓋下沒有正確連接VB.Net關於可空結構和事件?但是,使用可空結構確實的所有其他情況似乎都有效?
它似乎是你的電腦。 在你的項目中,你有沒有參考系統? 您引用了哪個版本的系統? – IndigoDelta 2011-06-06 08:57:46
看看我發現了什麼:「在VB中,」T「只能是一個類,一個接口或一個類型參數,而不是一個結構,Nullable是一個結構。希望能幫助到你。 – Reniuz 2011-06-06 09:00:29
你從哪裏找到Ren的? – Smudge202 2011-06-06 09:02:05