滚动到底部,编辑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
将以下内容添加到“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
结束模块
结果:
2190
5ef4ed7c-2720-4b37-b8ca-4ac044ec70d0
&LT;&LT;&LT;这里没有什么只是给回车
最后编辑(我希望):
自从Edit 19ish和@Chris以一个很好的例子加强这个问题后,这一切都变得安静了(谢谢Chris)。我会让问题变得更容易(并试图整理上述所有内容),有人能证明这不是MS错误或类似问题吗?对于可空的结构和事件而言,似乎有些东西没有正确地连接到VB.Net?但是,使用Nullable Structures 的所有其他情况似乎都有用吗?
答案 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)