1

这是问题“ CodeDom 在生成 ac# 方法时可以创建可选参数吗? ”的表亲。

我尝试了那里给出的答案。

不过,当我尝试编译时,我收到以下错误:

错误 BC30455:未为“公共函数栏”的参数“可选参数”指定参数(可选参数作为整数)作为整数

我已将其提炼为不支持 OptionalAttribute、DefaultParameterValueAttribute 或两者的 Visual Basic 编译器。

这是我正在编译的蒸馏代码:

Imports System.Runtime.InteropServices

Namespace SSI.RuntimeGenerated.FunctionsNamespace
    Public Class Functions
        Public Function Foo() As Integer

            return Bar()

        End Function

        Public Function Bar( _
            <[Optional], DefaultParameterValue(1)> _
            ByVal optionalParam As Integer) _
                As Integer

            return optionalParam

        End Function

    End Class
End Namespace

使用以下命令编译它:

"C:\Windows\Microsoft.NET\Framework\v4.0.30319\vbc.exe" /t:library /out:foobar.dll foobar.vb /langversion:11

产生以下输出:

Microsoft (R) Visual Basic Compiler version 11.0.50709.17929
Copyright (c) Microsoft Corporation All rights reserved.

C:\<snip>\foobar.vb : error BC30455: Argument not specified for parameter
'optionalParam' of 'Public Function Bar(optionalParam As Integer) As Integer'.
            return Bar()
                   ~~~~~

如果我手动将方法签名更改为

Public Function Bar(Optional ByVal optionalParam As Integer) As Integer

然后它编译就好了。

所以我的问题是:

  1. 如何在通过 CodeDom 生成的 Visual Basic 中创建可选参数?
  2. vbc 甚至支持使用 OptionalAttribute 和/或 DefaultParameterValueAttribute 吗?
  3. 如果 vbc 不支持这些属性,是否有任何可能的方法来创建可选参数而不使用 CodeSnippetStatement?
  4. 如果没有其他方法,那么是否有可能挽救我使用 CodeDom 完成的其他工作,这样我最终不必手动生成我的方法?我是否必须在 CodeSnippetTypeMember 中手动构建其余部分?甚至起作用吗?
4

1 回答 1

1

OptionalAttributeVB.NET 不支持。我找不到任何明确说明的官方文档,但是如果您尝试在 VB.NET 项目中使用它,它将没有任何效果。要在 VB.NET 中创建可选参数,您必须使用Optional关键字,例如:

Public Class Functions
    Public Function Foo() As Integer
        Return Bar()
    End Function

    Public Function Bar(Optional ByVal optionalParam As Integer = 1) As Integer
        Return optionalParam
    End Function
End Class
于 2013-08-27T19:22:29.090 回答