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

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

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

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

ошибка BC30455: Аргумент не указан для параметра «необязательный параметр» в «Панель общедоступных функций (необязательный параметр как целое число) как целое число»

Я преобразовал это в компилятор 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? Сработает ли даже это?

person devrelm    schedule 27.08.2013    source источник


Ответы (1)


OptionalAttribute не поддерживается в VB.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
person Steven Doggart    schedule 27.08.2013
comment
Фу. Спасибо за проверку. Я уже начал переписывать свой материал CodeDom, чтобы просто генерировать метод из своих моделей. Не должно быть слишком сложно, я просто предпочел бы, чтобы VBCodeProvider сделал это за меня, как и предполагалось. - person devrelm; 28.08.2013