VB2010 Optional仮引数配列の初期化方法

解決


まさお  2012-07-19 11:36:15  No: 147690  IP: 192.*.*.*

まさお と申します。  宜しくお願い致します。

  WinXP Pro SP3 VB2010 Express SP1 です。

  関数のOptional仮引数として配列を設定した場合に空配列に初期化する方法を教えて下さい。
  具体的には、
    Function foo(Optional ByRef hoge() As Integer = {}) As Integer
        If 0 < hoge.Count Then
            …

のようなことをしたいのですが {} が「定数式が必要」とのことでコンパイルエラーになります。
  Nothing が使えることは判っているのですが可能なら Nothing 以外の空配列で初期化したいと考えています。


以上、宜しくお願い致します。

編集 削除
YuO  2012-07-20 12:20:14  No: 147691  IP: 192.*.*.*

MSDN: 省略可能なパラメーター (Visual Basic)
http://msdn.microsoft.com/ja-jp/library/f25e2b6b
> 省略可能なパラメーターの既定値には、定数式を指定する必要があります。

で,定数式は
MSDN: Visual Basic 言語仕様
http://msdn.microsoft.com/ja-jp/library/ms234437
から仕様をダウンロードすると,11.2に記述があり,
> The type of a constant expression can be Byte, SByte, UShort, Short, UInteger, Integer, ULong, Long, Char, Single, Double, Decimal, Date, Boolean, String, Object, or any enumeration type.
とあり,さらに利用可能な演算子等が連なっています。
New 演算子は定数式に利用可能ではないため,配列は定数式に使えず,結果として省略可能なパラメータの既定値としては使えないことになります。

形式上<[Optional, DefaultParameterValue(New Integer() { 10, 15, 20 })>という属性を付けることで,
バイナリに既定値が配列であると埋め込むことは出来ますが,
VBおよびC#のコンパイラはこの形式のメソッドに対してデフォルト値がNothing (null) であるとみなして処理するため,
事実上利用できません。

編集 削除
まさお  2012-07-20 16:45:59  No: 147692  IP: 192.*.*.*

YuO さん、ありがとうございました。  (前回も!)

> 事実上利用できません。
>
  この結論を教えて戴けるまでの過程に感動します。
  先輩諸兄はこのように調べるのが普通なのでしょうか。

> MSDN: Visual Basic 言語仕様
>
  私もダウンロードしてみました。
    The Microsoft
    Visual Basic
    Language Specification
    Version 10.0
  和文だとしても626ページにもおよぶ資料を読みこなす気にはなれませんが、困り果てたときのバイブルとして保管しておきます。


解決しました。  本当にありがとうございました。

編集 削除
shu  2012-07-21 00:01:25  No: 147693  IP: 192.*.*.*

解決したようですが
Byrefにこだわらないなら

Function foo(ParamArray hoge() As Integer) As Integer

とすることで希望の処理は出来ると思いますが、
この関数内でhogeに新しい配列を設定するのなら前提がおかしくなると思います。

編集 削除