Как создать необязательные аргументы в Visual Basic, сгенерированные через CodeDom?

Это двоюродный брат вопроса " Может ли CodeDom создавать необязательные аргументы при генерации метода aC#?"

И я попробовал ответ, данный там.

Тем не менее, когда я пытаюсь скомпилировать, я получаю следующую ошибку:

ошибка BC30455: Аргумент не указан для параметра "optionParam" в "Публичная функциональная панель (optionParam как целое число) как целое число"

Я разобрал это до компилятора Visual Basic, не поддерживающего OptionalAttribute, DefaultParameterValueAttribute или обоих.

Вот дистиллированный код, который я компилирую:

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. Как создать необязательные аргументы в Visual Basic, сгенерированные через CodeDom?
  2. Поддерживает ли vbc использование OptionalAttribute и / или DefaultParameterValueAttribute?
  3. Если vbc не поддерживает эти атрибуты, есть ли какой-нибудь возможный способ создания дополнительных аргументов, не прибегая к использованию CodeSnippetStatement?
  4. Если нет другого пути, то возможно ли спасти другую работу, которую я проделал с CodeDom, чтобы мне не пришлось создавать свои методы вручную? Нужно ли собирать остальное вручную внутри CodeSnippetTypeMember? Будет ли это работать?

1 ответ

Решение

OptionalAttribute не поддерживается в VB.NET Я не могу найти никакой официальной документации, в которой это конкретно говорится, но если вы попытаетесь использовать ее в проекте VB.NET, это не будет иметь никакого эффекта. Чтобы создать необязательный параметр в VB.NET, вы должны использовать Optional ключевое слово, для instace:

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
Другие вопросы по тегам