【问题标题】:Optional VB Parameters are required in C#C# 中需要可选的 VB 参数
【发布时间】:2013-07-17 01:47:57
【问题描述】:

类似于this,但有一点不同。

VB函数声明:

Public Shared Function MyFunc(ByVal Name As String, ByVal Num As Integer, Optional ByRef obj As Object = Nothing, Optional ByVal val As Integer = 0) As Boolean

在 C# 中调用时(不同的解决方案,我复制了 .dll

错误 164 方法 'MyFunc' 没有重载需要 2 个参数

元数据显示函数为:

public static bool MyFunc(string Name, int Num, ref object obj, int val = 0);

为什么一个Optional 成功了,而另一个没有?

【问题讨论】:

    标签: c# .net vb.net optional-parameters


    【解决方案1】:

    C# 不支持可选的ref 参数。如果你把obj改成ByValue参数,应该没问题。

    如果您尝试在 C# 中声明一个可选的 ref 参数,您将违反 C# 4 规范的第 10.6.1 节:

    带有默认参数固定参数被称为可选参数

    ...

    refout 参数不能有 默认参数

    COM 例外,其中ref 参数非常常见。当 C# 编译器知道它正在处理 COM 组件时,它允许您省略可选的ref 参数。

    【讨论】:

    • 出于好奇,我交换了最后两个参数的顺序,虽然元数据是 public static bool MyFunc(string Name, int Num, int val = 0, ref object obj);,但 C# 项目接受它没有问题。尝试传递 2 个参数时,我得到了 No overload...takes 2 arguments。当尝试传递 3 个参数时,我得到了 No overload...takes 3 arguments。很有趣。
    • @JNF:您显示的元数据只是 IL 中任何内容的 C# 表示。我怀疑原始版本的真实元数据也很好 - 只是你用来将元数据翻译成 C# 的任何东西都没有弄清楚该怎么做。不过,我不会只更改参数的顺序 - 如果现在发生这种情况,则不能保证将来会发生这种情况。我会将签名更改为在 C# 中也可以表示的东西。
    • 不,好吧,那只是我在玩好奇的乔治。我最终在 VB 中重载。
    【解决方案2】:

    C# 不允许 by-ref 可选参数。就是这个原因。

    查看其他问题+答案:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-16
      • 1970-01-01
      • 2016-07-27
      • 1970-01-01
      • 2020-08-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多