将这段C#代码翻译成VB.NET

6

我试图翻译以下的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个回答

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

@Jared:谢谢,已修复。我的示例代码中没有将其作为模块的一部分 :) - Jon Skeet
为了成为 VB.Net 中有效的扩展方法,它必须在一个模块中定义。我不确定为什么他们会定下这个限制,因为跨程序集的 VB.Net 可以从非模块中导入它们,但事实就是如此 :) - JaredPar

3

看起来你缺少了一个约束条件:

C#:
   where T : class

VB:
   (Of T as class)

1

你的翻译没有问题。这是提供的C#代码最接近的VB.NET等效代码。

根据编译错误,ObjectSet类型期望泛型类型参数被限制为class。原始的C#示例没有这个限制,但如果有并且在问题中被省略了,那么VB.NET的等效代码如下。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接