将此C#代码翻译为VB.NET

时间:2011-08-16 20:56:57

标签: c# vb.net entity-framework

我尝试翻译以下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'不满足类型参数'TEntity'的'Class'约束。

我错过了什么?

4 个答案:

答案 0 :(得分:12)

由于同样的原因,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

答案 1 :(得分:3)

听起来你错过了一个约束:

C#:
   where T : class

VB:
   (Of T as class)

答案 2 :(得分:1)

您的翻译没有任何问题。这是与提供的C#代码最接近的VB.NET。

虽然类型ObjectSet期望泛型类型参数被约束为class,但基于编译错误。最初的C#示例没有那个,但是如果它确实并且从问题中省略了VB.NET的等价物如下。

Public Sub AddObjects(Of T As Class)(ByVal objectSet As ObjectSet(Of T) ...

答案 3 :(得分:0)

另一个转换为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