Перевод этого кода C # на VB.NET - PullRequest
6 голосов
/ 17 августа 2011

Я пытался перевести следующий код C #

public static class ObjectSetExtensions
{
    public static void AddObjects<T>(this ObjectSet<T> objectSet, IEnumerable<T> objects)
    {
         foreach (var item in objects)
         {
             objectSet.AddObject(item);
         }
    }
}

в VB.NET:

Module ObjectSetExtensions
    <System.Runtime.CompilerServices.Extension()>
    Public Sub AddObjects(Of T)(ByVal objectSet As ObjectSet(Of T), ByVal objects As IEnumerable(Of T))
        For Each item In objects
            objectSet.AddObject(item)
        Next
    End Sub
End Module

Но я получаю сообщение об ошибке:

Аргумент типа 'T' не удовлетворяет ограничению 'Class' для параметра типа 'TEntity'.

Что мне не хватает?

Ответы [ 4 ]

12 голосов
/ 17 августа 2011

Версия C # также не компилируется по той же причине. Должно быть:

public static void AddObjects<T>(this ObjectSet<T> objectSet,
                                 IEnumerable<T> objects)
    where T : class // Note this bit
{
     foreach (var item in objects)
     {
         objectSet.AddObject(item);
     }
}

И версия VB:

<Extension> _
Public Sub AddObjects(Of T As Class)(ByVal objectSet As ObjectSet(Of T), _
                                     ByVal objects As IEnumerable(Of T))
    Dim local As T
    For Each local In objects
        objectSet.AddObject(local)
    Next
End Sub

Обратите внимание, что в версии VB ограничение является частью объявления параметра типа. Подробнее см. MSDN .

3 голосов
/ 17 августа 2011

Звучит так, как будто вам не хватает ограничения:

C#:
   where T : class

VB:
   (Of T as class)
1 голос
/ 17 августа 2011

В вашем переводе нет ничего плохого. Это самый близкий VB.NET-эквивалент предоставленного кода C #.

На основании ошибки компиляции, хотя тип ObjectSet ожидает, что параметр универсального типа будет ограничен class. Оригинальный пример C # не имеет этого, но если он имел и был опущен в вопросе, эквивалент VB.NET следующий.

Public Sub AddObjects(Of T As Class)(ByVal objectSet As ObjectSet(Of T) ...
0 голосов
/ 17 августа 2011

Еще одно преобразование в VB.NET:

Public NotInheritable Class ObjectSetExtensions

    Private Sub New()
    End Sub

    <System.Runtime.CompilerServices.Extension> _
    Public Shared Sub AddObjects(Of T)(objectSet As ObjectSet(Of T), objects As IEnumerable(Of T))
        For Each item As var In objects
            objectSet.AddObject(item)
        Next
    End Sub

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