我有一个问题,就是VB.NET编译器无法编译一个类(在一个单独的C#程序集中),该类包含具有泛型参数的两个重载方法。相同程序集中的等效C#代码可以编译而不会出现错误。
这里是这两个方法的签名:
protected void SetValue<T>(T newValue, ref T oldValue)
protected void SetValue<T>(T? newValue, ref T? oldValue) where T : struct
以下是三个演示问题的程序集代码。第一个是C#程序集,其中包含实现泛型方法的基类。第二个是从Base派生的C#类,并正确调用了SetValue的两个重载。第三个是从Base派生的VB类,但无法编译,出现以下错误信息:
错误1:重载决策失败,因为这些参数没有可访问的“SetValue”最具体: “Protected Sub SetValue(Of T As Structure)(newValue As System.Nullable(Of Integer),ByRef oldValue As System.Nullable(Of Integer))”:不是最具体的。 “Protected Sub SetValue(Of T)(newValue As System.Nullable(Of Integer),ByRef oldValue As System.Nullable(Of Integer))”:不是最具体的。
Base Class assembly
example:
public class Base { protected void SetValue<T>(T newValue, ref T oldValue) { } protected void SetValue<T>(T? newValue, ref T? oldValue) where T : struct { } }
C# Derived Class
example:
public class DerivedCSharp : Base { private int _intValue; private int? _intNullableValue; public void Test1(int value) { SetValue(value, ref _intValue); } public void Test2(int? value) { SetValue(value, ref _intNullableValue); } }
VB Derived Class
example:
Public Class DerivedVB Inherits Base Private _intValue As Integer Private _intNullableValue As Nullable(Of Integer) Public Sub Test1(ByVal value As Integer) SetValue(value, _intValue) End Sub Public Sub Test2(ByVal value As Nullable(Of Integer)) SetValue(value, _intNullableValue) End Sub End Class
在VB代码中我做错了什么吗?还是说C#和VB在泛型重载解析方面有所不同?如果我将Base方法的参数设为非泛型,则一切都能正确编译,但这样我就必须为每种类型实现SetValue。