Обнуляемый (из Guid) с Generic Delegate вызывает странную (скрытую) ошибку? - PullRequest
1 голос
/ 06 июня 2011

Прокрутите вниз, отредактируйте 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

  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
    

    Конечный модуль

Результаты:

2190

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

<<< Ничто здесь ему не дало только возврат каретки </em>

ПОСЛЕДНИЕ РЕДАКТИРОВАТЬ (я надеюсь):

Все прошло тихо, так как Edit 19ish и @Chris подкрепили проблему хорошим примером (спасибо Крис). Я сделаю вопрос немного проще (и попытаюсь привести в порядок все вышеперечисленное), кто-нибудь может доказать, что это не ошибка MS или что-то подобное? Кажется, что-то не так правильно подключено к VB.Net в отношении Nullable Structures and Events? Тем не менее, во всех других случаях использования Nullable Structures работает?

Ответы [ 3 ]

3 голосов
/ 06 июня 2011

Казалось бы, ошибка в коде, сгенерированном за кулисами компилятором 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 голосов
/ 06 июня 2011

Я объясняю это ошибкой в ​​Framework.Я опубликовал сообщение об ошибке при подключении .

. Я не буду помечать свой собственный ответ как еще один или два дня, если кто-то можетукажите на то, что мы упустили из виду.

Спасибо всем за ваше время!

0 голосов
/ 06 июня 2011

К сожалению, в VB параметром типа может быть только класс, а не структура.

Быстрый и грязный обходной путь будет в том, чтобы упаковать Guid? внутри объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...