2011-06-06 41 views
1

滾動到底部,編輯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

  1. 創建VB.Net控制檯應用程序
  2. 以下內容添加到「模塊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關於可空結構和事件?但是,使用可空結構確實的所有其他情況似乎都有效?

+0

它似乎是你的電腦。 在你的項目中,你有沒有參考系統? 您引用了哪個版本的系統? – IndigoDelta 2011-06-06 08:57:46

+0

看看我發現了什麼:「在VB中,」T「只能是一個類,一個接口或一個類型參數,而不是一個結構,Nullable是一個結構。希望能幫助到你。 – Reniuz 2011-06-06 09:00:29

+0

你從哪裏找到Ren的? – Smudge202 2011-06-06 09:02:05

回答

3

這似乎是由VB.Net編譯器在後臺生成的代碼中的錯誤。下面編譯罰款,並應在功能上等同:

Public Class Class1 
    Private Delegate Sub AnEventHandler(Of T)(ByVal newValue As T) 
    Private OnSomethingEvent As AnEventHandler(Of Nullable(Of Guid)) 
    Private Custom Event OnSomething As AnEventHandler(Of Nullable(Of Guid)) 
     AddHandler(value As AnEventHandler(Of Nullable(Of Guid))) 
      Me.OnSomethingEvent = DirectCast(System.Delegate.Combine(Me.OnSomethingEvent, value), AnEventHandler(Of Nullable(Of Guid))) 
     End AddHandler 

     RemoveHandler(value As AnEventHandler(Of Nullable(Of Guid))) 
      Me.OnSomethingEvent = DirectCast(System.Delegate.Remove(Me.OnSomethingEvent, value), AnEventHandler(Of Nullable(Of Guid))) 
     End RemoveHandler 

     RaiseEvent(newValue As System.Guid?) 
      Dim aeh = OnSomethingEvent 
      If Not aeh Is Nothing Then 
       aeh(newValue) 
      End If 
     End RaiseEvent 
    End Event 
End Class 

(因此,也,爲什麼你沒有得到行號的錯誤 - 在錯誤出現在代碼中不存在任何你行已經寫了)

+0

這看起來很棒@Damien。所以這個錯誤是在自動生成的代碼中,而不是在某個地方的.Net Framework核心的一些黑暗塵封的櫥櫃中,明確寫入事件看起來似乎否定了錯誤。非常感謝你! – Smudge202 2011-06-06 11:09:42

+0

我已將您的答案添加爲[連接錯誤]的解決方法(https://connect.microsoft.com/VisualStudio/feedback/details/674265/nullable-of-structures-do-not-work-with-events #)。我已經在那裏指定並感謝你,所以希望沒關係?乾杯。 – Smudge202 2011-06-07 08:14:41

+0

@ Smudge202 - 沒問題 - 這是一個有趣的挖掘。 – 2011-06-07 08:19:57

0

不幸的是在VB中,一個類型參數只能是一個類,而不是一個結構。

一個快速和骯髒的解決方法是將Guid?在一個對象內。

+0

感謝Paulo。最後一點,爲什麼Nullable Of Integer可以工作,但不是guid?我很欣賞價值類型和結構有所不同,但Nullable是一種結構,但與價值類型結合使用時,它仍然有效? – Smudge202 2011-06-06 09:07:01

+0

不確定,因爲我剛剛注意到,當你指出,並且如果你添加一個「As Structure」約束給委託,你會注意到錯誤與「'System.Nullable'不符合'結構'約束類型參數'T',只允許不可爲空的'結構'類型。「 所有自定義結構都會產生與您的問題相同的錯誤,但它確實可以使用原生值類型,比如像您指出的Integer(以及Double,Char等)。 – 2011-06-06 09:25:08

+0

有趣。所以似乎有某種特殊的佈線可用於vb中?而我的OP可能更多的是爲什麼我*不*在這些情況下獲取錯誤消息,而不是爲什麼我會收到消息......? – Smudge202 2011-06-06 09:27:52

0

我把這一個放在框架中的一個錯誤。我已發佈bug report on connect

我不會將自己的答案標記爲回答一兩天,以防其他人指出我們迄今爲止忽略的內容。

非常感謝大家!