c# - vb.net 重载解析失败,出现 "multiple members with this name exist in class"

标签 c# vb.net opengl opentk

最近,我收到了 VB.Net 用户关于 strange overload resolution failure 的错误报告升级到较新版本的 OpenTK 时:错误 1“Uniform3”不明确,因为类“OpenTK.Graphics.OpenGL.GL”中存在多种具有此名称的成员

为什么这么奇怪?因为所讨论的重载在库的旧版本和新版本之间是相同的!

后来进行了一些测试,我设法在一个小测试用例中隔离了问题:

// C# library - this one works
namespace Test
{
    public partial class GL
    {
        public static void Foo(float bar) { }
    }

    public partial class GL
    {
        public static void Foo(int bar) { }
        public static void Foo(ref int bar) { }
    }
}

VB.Net 可以毫无问题地使用上述代码。但是,如果我重新排序这两个部分类:

// C# library - this one fails
namespace Test
{
    public partial class GL
    {
        public static void Foo(int bar) { }
        public static void Foo(ref int bar) { }
    }

    public partial class GL
    {
        public static void Foo(float bar) { }
    }
}

我失败了!

VB.Net 代码如下所示:

REM VB.Net code that consumes the C# library
Module Module1

Sub Main()
    Test.GL.Foo(0)
End Sub

End Module

这是怎么回事?!为什么两个部分类的顺序很重要?

更重要的是,是否有比重新排序 C# 代码文件并希望编译器以一种方式而不是另一种方式使用它们更好的解决方案? (例如,在 VB.Net 中的重载解析期间,是否有一些我可以应用的属性来从考虑中删除其中一个重载?)

最佳答案

我通过更改重载在已编译二进制文件中出现的顺序解决了这个问题。这在许多不同方面都很糟糕,但目前看来效果还不错。

关于c# - vb.net 重载解析失败,出现 "multiple members with this name exist in class",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21731486/

相关文章:

c++ - 用 C++ 将未压缩的 TGA 写入文件

sql - Linq - 类型 'System.Guid' 的值无法转换为 'String'

vb.net - 重新保护 Excel 工作表,启用自动筛选

sql - 类型 'System.Data.SqlClient.SqlConnection'的错误值无法转换为 'String'

c++ - 动态生成对象的 glewInit() 错误?

objective-c - 什么是 wglMakeCurrent 或 glXMakeCurrent 的 Cocoa/OSX 等价物?

c# - 如何从文件路径中删除版本号? -Winforms C#

c# - 是否可以使用 SaveAsDialogBox 保存带有图标的文件?

c# - 使用依赖注入(inject)测试 TypeFilterAttribute

c# - Marshall 在 c# 中使用 ifdef 和联合构造结构