2013-08-27 8 views
1

Это двоюродный брат вопроса «Can CodeDom create optional arguments when generating a c# method?»Как создать необязательные аргументы в Visual Basic, сгенерированные через CodeDom?

И я попробовал ответить there.

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

error BC30455: Argument not specified for parameter 'optionalParam' of 'Public Function Bar(optionalParam As Integer) As Integer

Я дистиллированную это вплоть до Visual Basic Compiler не поддерживает ни 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 
+0

Ugh. Спасибо за проверку. Я уже начал переписывать свой материал CodeDom, чтобы просто генерировать метод из моих моделей. Не должно быть слишком жестким, я просто предпочел бы, чтобы VBCodeProvider делал это для меня, как и предполагалось. – devrelm