我尝试翻译以下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'约束。
我错过了什么?
答案 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