Прокрутите вниз, отредактируйте 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;
}
С указанным выше кодом VB в .Net3.5 и .Net 4, Visual Studio 2008 и 2010, независимо от типа проекта, вы получите следующую ошибку:
Тип 'Global.System.Guid' не определен.
Вы не можете перейти к ошибке двойным щелчком, и номера строк / столбцов не указываются.
Не не цитата из здесь , что:
«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
Вы можете использовать Nullable Guids, как показано здесь:
Private Sub StackOverflowTest()
Dim s As Nullable(Of Guid)
If s.HasValue Then
'Do something
End If
End Sub
Этот код компилируется и работает так, как вы можете себе представить. Даже следующий код, который использует обобщенные и обнуляемые направляющие, работает !!
Private Sub StackOverflowTest2(Of T)()
' do stuff
End Sub
Private Sub StackOverflowTest3()
StackOverflowTest2(Of Nullable(Of Guid))()
End Sub
Однако мой конкретный пример, приведенный в самом верху, не работает. Зачем? Ясно, что T работает со структурами ...
РЕДАКТИРОВАТЬ 19ish! = D
- Создание консольного приложения VB.Net
Добавить следующее в "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
<<< Ничто здесь ему не дало только возврат каретки </em>
ПОСЛЕДНИЕ РЕДАКТИРОВАТЬ (я надеюсь):
Все прошло тихо, так как Edit 19ish и @Chris подкрепили проблему хорошим примером (спасибо Крис). Я сделаю вопрос немного проще (и попытаюсь привести в порядок все вышеперечисленное), кто-нибудь может доказать, что это не ошибка MS или что-то подобное? Кажется, что-то не так правильно подключено к VB.Net в отношении Nullable Structures and Events? Тем не менее, во всех других случаях использования Nullable Structures работает?