gpt4 book ai didi

c# - VB中泛型方法重载编译错误

转载 作者:行者123 更新时间:2023-11-30 15:49:43 25 4
gpt4 key购买 nike

我有一个问题,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))':不是最具体的。

  1. 基类组装

    例子:

    public class Base
    {
    protected void SetValue<T>(T newValue, ref T oldValue)
    {
    }
    protected void SetValue<T>(T? newValue, ref T? oldValue) where T : struct
    {
    }
    }
  2. C# 派生类

    例子:

    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);
    }
    }
  3. VB 派生类

    例子:

    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。

最佳答案

我坚持我的意见,这很可能是一个错误。但是,我可以使用 Mono VB 编译器 vbnc 重现它。这里的(有点困惑的)错误消息是“No non-narrowing (except object)”——我认为这是指缺少隐式转换,因此涉及相同的重载解析问题。

问题似乎是由于 ByRef 参数,编译器的重载解析失败,因为这需要一些特殊的管理,这在 C# 调用中是明确的,但在 VB 调用中不是。

关于c# - VB中泛型方法重载编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1230618/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com