VB.NET和调用byval / byref C#重载

时间:2018-01-03 19:01:29

标签: c# vb.net byref method-resolution-order byval

我们有一个C#类,它包含两个函数,它们的参数只有参数修饰符:

bool DoSomething(Object obj){};
bool DoSomething(ref Object obj){};

现在我们需要从VB.NET中调用这个方法(实际上是其中任何一个)。问题是VB.NET编译器无法决定使用哪种方法。

问题是:有没有办法告诉编译器我们想要第一个变体(或第二个变量,它对调用者来说并不重要)?

在VB.NET中将呼叫写为DoSomething((myObj))(即添加括号)并没有帮助。

2 个答案:

答案 0 :(得分:3)

您可以创建一个用C#编写的单独库,它提供具有不同名称的辅助方法,使您可以调用模糊定义的Dim methods = GetType(WhatEverTheType).GetMethods() Dim doSomethingMethod = methods.Single(Function(method As MethodInfo) Return method.Name = "DoSomething" _ And Not method.GetParameters()(0).ParameterType.IsByRef End Function) doSomethingMethod.Invoke(instanceOfWhatEverTheType) 方法。你不应该这样做,人们可能想知道你为什么这样做,所以你可以用尖刻的评论来解释它为什么是必要的。

或者你可以使用反射,大概是这样的:

{{1}}

答案 1 :(得分:2)

AFAIK,唯一的方法是使用Reflection强制调用API。虽然我不完全确定这是否有用。

问题是创建仅仅load: Centipede can't be instantiated. java.lang.InstantiationException: Centipede at java.lang.Class.newInstance(Class.java:427) at sun.applet.AppletPanel.createApplet(AppletPanel.java:799) at sun.applet.AppletPanel.runLoader(AppletPanel.java:728) at sun.applet.AppletPanel.run(AppletPanel.java:378) at java.lang.Thread.run(Thread.java:745) Caused by: java.lang.NoSuchMethodException: Centipede.<init>() at java.lang.Class.getConstructor0(Class.java:3082) at java.lang.Class.newInstance(Class.java:412) ... 4 more 不同的2个重载不符合CLS,因此无法保证在所有.NET语言中都能使用。为了防止遇到这种情况,您应该将CLSCompliantAttribute添加到ref文件中,然后编译器会在您破坏CLS兼容性时发出警告。

AssemblyInfo.cs

你可以通过添加一个可以通过VB.NET调用的包装函数来解决这个问题。

[assembly: System.CLSCompliant(true)]

有一些不同的方法可以使这个更清洁,例如像Scott Hannen提到的那样单独组装它,或者只是通过使CLS合规的包装方法成为扩展方法。