使用Generic Delegate的Nullable(Guid)导致奇怪(隐藏)错误?

时间:2011-06-06 08:53:19

标签: c# vb.net visual-studio-2008 visual-studio-2010 .net-4.0

滚动到底部,编辑19以后。有关好的例子,请参阅@ Chris的评论

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,Visual Studio 2008和2010中的上述VB代码,无论项目类型如何,都会出现以下错误:

未定义类型'Global.System.Guid'。

您无法通过双击导航到错误,也没有给出行/列号。

not 引用here: “T”只能是Class,接口或类型参数。

...因为错误,如下所示。

确认此陈述,有几个事实

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

您可以使用Nullable Guids,如下所示:

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. 将以下内容添加到“Module1.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
    

    结束模块

  3. 结果:

    2190

    5ef4ed7c-2720-4b37-b8ca-4ac044ec70d0

    &LT;&LT;&LT;这里没有什么只是给回车

    最后编辑(我希望):

    自从Edit 19ish和@Chris以一个很好的例子加强这个问题后,这一切都变得安静了(谢谢Chris)。我会让问题变得更容易(并试图整理上述所有内容),有人能证明这不是MS错误或类似问题吗?对于可空的结构和事件而言,似乎有些东西没有正确地连接到VB.Net?但是,使用Nullable Structures 的所有其他情况似乎都有用吗?

3 个答案:

答案 0 :(得分: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

(因此,为什么你没有得到错误的行号 - 错误出现在你编写的任何行中都没有的代码中)

答案 1 :(得分:0)

不幸的是,在VB中,类型参数只能是类,而不是结构。

快速而肮脏的解决方法是装箱Guid?在一个对象中。

答案 2 :(得分:0)

我将这个问题归结为框架中的一个错误。我发布了bug report on connect

我不会将自己的答案标记为 的答案一两天,以防其他人指出我们迄今为止忽略的事情。

感谢大家到目前为止的时间!