Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# vb.net重载解析失败,返回“0”;类“中存在多个具有此名称的成员”;_C#_Vb.net_Opengl_Opentk - Fatal编程技术网

C# vb.net重载解析失败,返回“0”;类“中存在多个具有此名称的成员”;

C# vb.net重载解析失败,返回“0”;类“中存在多个具有此名称的成员”;,c#,vb.net,opengl,opentk,C#,Vb.net,Opengl,Opentk,最近,我收到一个VB.Net用户的错误报告,关于升级到更新版本的OpenTK时出现的错误:错误1“Uniform3”不明确,因为类“OpenTK.Graphics.OpenGL.GL”中存在多种具有此名称的成员。 为什么这很奇怪?因为所讨论的重载在库的旧版本和新版本之间是相同的 在一些测试之后,我成功地在一个小测试用例中隔离了问题: // C# library - this one works namespace Test { public partial class GL {

最近,我收到一个VB.Net用户的错误报告,关于升级到更新版本的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的重载解析过程中,我是否可以应用某些属性来删除其中一个重载?

我通过更改重载在已编译二进制文件中的显示顺序来解决这个问题。这在许多不同的方面都很糟糕,但目前它似乎工作得很好。

在VB.NET中,您不能声明重载,其中签名的唯一区别是
ByRef
ByVal
。原因是,在VB.NET中调用该方法时,没有
out
关键字(就像在C#中一样)。因此,编译器不可能解析您试图调用的重载。所以,让我困惑的不是错误。让我困惑的是,为什么你有时不知道错误!我知道,
ByRef
方法在库中显式标记为
CLSCompliant(false)
。在这种情况下,VB.Net只会忽略它无法调用的重载(即它们不会出现在intellisense中),这在OpenTK中是很好的,因为“坏”重载的存在只是为了方便。问题是,在失败的情况下,没有一个重载出现——即使是可以调用的重载!