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

本文关键字:VB NET 翻译 代码 将此 | 更新日期: 2023-09-27 18:05:52

我试着翻译下面的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。净:

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'约束。

我错过了什么?

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

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。

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

C#:
   where T : class
VB:
   (Of T as class)

你的翻译没有问题。这是最接近的VB。. NET等价的c#代码。

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

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

另一个到VB的转换。净:

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