遅延バインディングを使用できません!の回避方法

このQ&Aのポイント
  • VB.Net の初学者です。ArrayList の疑似的な2次元配列でのエラーの回避要領についてお知りになりたいです。Option Strict On では遅延バインディングを使用できません。ArrayList または List の次元は常に 1 次元であるため、遅延バインディングを回避する方法について考えています。
  • 遅延バインディングを使用できません!Option Strict On ではArrayList または List の次元は常に 1 次元であるため、エラーを回避する方法について教えてください。ArrayList の疑似的な2次元配列を使用しているので、具体的なコード例も教えていただけると助かります。
  • VB.Net の初学者です。ArrayList の2次元配列で遅延バインディングを使用したい場合、Option Strict On ではエラーが発生します。そこで、遅延バインディングを回避する方法を教えていただけないでしょうか。ArrayList の疑似的な2次元配列を使用しているため、具体的なコード例やアドバイスをいただけるとうれしいです。
回答を見る
  • ベストアンサー

遅延バインディングを使用できません!の回避方法?

VB.Net の初学者です。 Sub Main() でのデータ型、演算子、式等の確認をしているレベルです。 今回の質問は、ArrayList の疑似的な2次元配列でのエラーの回避要領についてです。 'Option Strict On ' ============================== ' FileReadToArrayLists のテスト ' ============================== Sub Main()   Dim aAttachs As New ArrayList   FileReadToArrayLists("D:\Temp\付属一覧.csv", aAttachs)   Debug.Print(aAttachs(0)(0))   Debug.Print(aAttachs(0)(1))   Debug.Print(aAttachs(0)(2))   Debug.Print(aAttachs(0)(3)) End Sub [イミディエイト ウインドウ] 品番001 品番001用付属1 品番001用付属2 品番001用付属3 ========================================================== Option Strict On では遅延バインディングを使用できません! ========================================================== >Array には複数の次元を指定できますが、 >ArrayList または List<(Of <(T>)>) の次元は常に 1 次元です。 「もし、もしではあるが、配列そのものをリストの項目としたら・・・」 「それも 1 次元じゃーないか・・・」 と、考えたまでは良かったのですが・・・。 上記のエラーの回避要領がわかりません。

noname#140971
noname#140971

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

>「厳密に!」を重視して 嬉しいねぇ >List コレクション型では成功しましたがArrayList コレクション型では失敗。この辺りは、どうなんでしょうか? んー、C#にはArrayList<T>ってのは無いんだよね。 List<T>とかArrayListはあるけど。 Javaは逆にArrayList<T>はあるけど List<T>ってのはインターフェースであって クラスじゃない(ちなみにC#のインターフェースはIList<T>) #ただ単にライブラリ製作者の名前の付け方の考え方が違うだけだと思う。

noname#140971
質問者

お礼

>「厳密に!」を重視して 嬉しいねぇ 意味ありげなoptionを書かれれば・・・。 しかし、全てのプロジェクトを消して40日のメモを見てのやり直し。 結構、大変でした。 しかし、型の理解に関する中途半端さを思い知ることができました。 #ただ単にライブラリ製作者の名前の付け方の考え方が違うだけだと思う。 ここで決着します。 いずれにしろ、List を使えば良いわけですから・・・。 ありがとうございました。

その他の回答 (1)

回答No.1

うん、やっぱり一発で何が聞きたいか読み取れない >「もし、もしではあるが、配列そのものをリストの項目としたら・・・」 >「それも 1 次元じゃーないか・・・」 そこまでは問題ないんじゃないの? http://oshiete1.goo.ne.jp/qa4752021.html の時はそういうつもりで書いているし。 これかなあ…聞きたいのって。 =========== 何故エラーになるのか: http://msdn.microsoft.com/en-us/library/system.collections.arraylist.item%28VS.71%29.aspx 戻り値がObjectであって,配列やArrayListじゃないから, 自分で変換しないといけない。 Option Explicit On Option Strict On Option Compare Binary Option Infer Off Class Q4781160 Shared Sub Main() Dim x As System.Collections.ArrayList Dim y As String() = {"その1","その2"} x = New ArrayList() x.Add(DirectCast(y,Object)) '実際には継承元にはDirectCastを使わなくて良い System.Console.WriteLine(DirectCast(x(0),String())(0)) System.Console.ReadKey(True) 'でいちいち変換するのが嫌だから Dim z As System.Collections.Generic.List(Of String()) z = new System.Collections.Generic.List(Of String())() z.Add(y) System.Console.WriteLine(z(0)(0)) 'というような構文が.NET 2.0から導入されたわけ。 ' End Sub End Class 'という風に。Q4752021でもこの構文を使っている。

noname#140971
質問者

お礼

' ================================= ' FileReadToArrayLists のテスト2 ' ================================= Module theFileReadToArrayLists   Sub Main()     On Error Resume Next     Dim I As Integer     Dim N As Integer     Dim aAttachs As New ArrayList     FileReadToArrayLists("D:\Temp\付属一覧.csv", aAttachs, , True)     Debug.Print(DirectCast(aAttachs.Item(1), String())(0))     Debug.Print(DirectCast(aAttachs.Item(1), String())(1))     Debug.Print(DirectCast(aAttachs.Item(1), String())(2))     Debug.Print(DirectCast(aAttachs.Item(1), String())(3))   End Sub End Module [イミディエイト ウインドウ] 品番001 品番001用付属1 品番001用付属2 品番001用付属3 成功しました。 ここ5日間は、ともかく回答にある「厳密に!」を重視して40日の演習を全てやり直しました。 その中で、質問にあるエラーに遭遇しました。 そうして、質問に至った次第です。 >戻り値がObjectであって,配列やArrayListじゃないから・・・ ここまでは気が付きましたが・・・。 しかし、其の先の何がなにやらサッパリでした。 「奇を衒った関数を作ったのが誤り」という結論で納得しつつありました。 そういう意味では、本当にありがとうございます。 なお、十分には理解してはいませんが、疑似的2元配列ですと BinarySearch メソッドに使えるようです。 そういう意味でも、本当にありがとうございます。 >'でいちいち変換するのが嫌だから >Dim z As System.Collections.Generic.List(Of String()) >z = new System.Collections.Generic.List(Of String())() >z.Add(y) >System.Console.WriteLine(z(0)(0)) >'というような構文が.NET 2.0から導入されたわけ。 この回答は、真っ先に試しました。 しかし、 List コレクション型では成功しましたがArrayList コレクション型では失敗。 この辺りは、どうなんでしょうか?

関連するQ&A

  • 遅延バインディングの回避方法

    お世話になります。 テキストボックスにファイルをドロップして、そのファイルパスを取得したいのですが、「Option Strict Onでは、遅延バインディングを使用できません」と出ます。 これを回避するにはどうすればいいのでしょうか? /*-------------------------------------------- Private Sub TextBox_DragDrop(ByVal sender As Object, ByVal e As DragEventArgs) Handles TextBox.DragDrop 'ファイルパス Dim strPath As String 'この行で「遅延バインディング」が発生 strPath = e.Data.GetData(DataFormats.FileDrop)(0) End Sub /*--------------------------------------------

  • VB2008: CSV を二次元配列に読み込む方法?

    VB.NET を知って今日で30日目という初学者です。 付属一覧.csv 品番001, 品番001用付属1, 品番001用付属2, 品番001用付属3 品番002, 品番002用付属1, 品番002用付属2, 品番002用付属3 品番003, 品番003用付属1, 品番003用付属2, 品番003用付属3 品番004, 品番004用付属1, 品番004用付属2, 品番004用付属3 品番005, 品番005用付属1, 品番005用付属2, 品番005用付属3 今、上記のCVSファイル配列に読み込む方法を探っています。 Using MyReader As New TextFieldParser(aFile, Encoding.Default)   While Not MyReader.EndOfData     aLines.Add(MyReader.ReadLine())   End While End Using と、ここまでは何とか回答に助けられて到達。 aLines は List です。 しかし、これは一次元配列。 Dim aFields(,) As String ReDim aFiles(N, M) As String とやれば、行ではなくフィールドで読めば、二次元配列も可能とは思っています。 しかし、これは N を確定する手続きが必須。 そこで質問は、そうしない妙手に関してです。 宜しくお願いします。

  • Option Strictと構造体とArrayListの関係について(VB2005)

    下記はArrayListに構造体の値を格納し、表示させるプログラムです。 -------------------------------- Option Strict Off '構造体 Public Structure hoge   Dim a As String   Dim b As String   Dim c As String End Structure Private Sub test()   Dim aryhoge As New ArrayList   Dim foo As hoge   foo.a = "aa"   foo.b = "bb"   foo.c = "cc"   aryhoge.Add(foo)           MessageBox.Show(aryhoge(0).a)  'A) Option Strict Off だと"aa"と表示される End Sub -------------------------------- このプログラムはOption Strict Offだとメッセージボックスに"aa"と表示されます。 ですがOption Strict Onだと、(A)の箇所にて「遅延バインディングを使用できません」というエラーが発生し、実行ができません。 質問内容は、Option Strict Onで上記のプログラムを動かすには、(A)をどのように修正すればよいか、というものです。 どうぞよろしくお願い致します。

  • ArrayListによる計算表作成

    for文を使用し九九の計算結果を配列に格納し、その配列内の情報を表形式で表示してみる。※配列はArrayListを使用すること 上記の問題を解いています。 -------------------------------------------------------------- import java.util.ArrayList; public class m4_2 { public static void main(String args[]) { ArrayList list = new ArrayList(); String[]s = new String[9]; for(int i = 1; i<=s.length; i++){ for(int j =1; j<=s.length; j++){ list.add((i * j));     //ここがどのように記述するか?? } System.out.print(list.get(0)); System.out.print(list.get(1)); System.out.print(list.get(2)); System.out.print(list.get(3)); System.out.print(list.get(4)); System.out.print(list.get(5)); System.out.print(list.get(6)); System.out.print(list.get(7)); System.out.print(list.get(8)); System.out.print("\n"); } } } ---------------------------------------------------------- 実行結果イメージ 1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 (以下省略) 私の書いたソースでは1の位しか計算してくれません。 今月から本格的にJavaを勉強し始めた初心者なので どうかよろしくお願いいたします。

    • ベストアンサー
    • Java
  • サイズのわからない配列

    お世話になっております。 最初からサイズの不明な配列を扱いたいときに、いろいろ調べたら 配列が1次元の場合、次のような方法で扱えることがわかりました。 dim userlist as new list(of string) 'List dim user as string() '配列 userlist.add("taro") userlist.add("hanako") user = userlist.toarray 'Listを配列に変換 debug.print(user.length) '配列のサイズを求める ところが、配列が2次元の場合、Listは使えないようなのです。 UserID password ------+--------- taro abc hanako xyz こんな感じの2次元データを最初から配列の大きさを定義すること なく利用したいのですが、何か良い方法がございましたら、ご教授 のほどお願いいたします。

  • 二次元配列のVBA

    二次元配列のVBAの書き方がよくわからないのですが、 私が作ったサンプルプログラムのSub 二次元()において 二次元配列で表すにはどうすればいいのでしょうか? Sub 二次元()では 配列を格納する変数はtmpしか使っていませんが もう一つ配列を格納する用の変数を作ればいいのでしょうか? 数字とアルファベットは別々に取り出したいです。 ----------------------------------------------------- Sub 一次元() Dim myStr As String Dim tmp As Variant Dim i As Long For i = 1 To 5 myStr = myStr & "," & i Next myStr = Mid(myStr, 2) tmp = Split(myStr, ",") For i = LBound(tmp) To UBound(tmp) Debug.Print tmp(i) Next i End Sub Sub 二次元() Dim myStr As String Dim tmp As Variant Dim i As Long For i = 1 To 5 myStr = myStr & "," & i & "と" & Chr(64 + i) Next myStr = Mid(myStr, 2) tmp = Split(myStr, ",") For i = LBound(tmp) To UBound(tmp) Debug.Print tmp(i) Next i End Sub

  • 多次元配列(リファレンスを用いて)の行にアクセスする方法

    多次元配列において、行全体を表示させるには、どのようにしたらよいのでしょうか。 例えば、以下のような(無名)配列を作成したあとに、2行目を全て表示させる方法です。 @ARRAY = ( ["00", "01", "02"], ["10", "11", "12"], ["20", "21", "22"] ); cf: 一次元の場合は @list = ("1", "2", "3"); $ref = \@list; (print $ref; # ARRAY(0x9986)などとアドレスが表示) print @$ref; # 配列の全てが表示 ( print $$ref[1]; # "2"が表示 ) とやれるので、同じように $ref = \@ARRAY; print @$ref[1]; としてみても上手くゆきません。 (print $$ref[1][1]; # "11"が表示 はOK) すみませんが、宜しくお願い致します。

  • C# ArrayListを二次元配列のように使用したい。

    C#についての質問です。 現在、ArrayListを用いた情報管理リストのプログラムを作成しています。 そのプログラムにソートを行う機能と、検索機能をつけたいのですが、そこで質問です。 ArrayList内の要素を、「特定のフィールド(例えば氏名であったり、年齢であったりするのですが…)を基準として昇順または降順にソートする」という処理、またあるフィールドのみを基準に検索を行うという処理を行う際、ArrayListを二次元配列のように使用することが出来たら便利だな、と思ったのですが、そのようなことは可能でしょうか? いろいろと試したり、独自に調べてはみたのですが、いまいちわからず、質問させていただきました。 お分かりになられる方がいらっしゃいましたら、ご教授いただければと思います。 よろしくお願いいたします。

  • Perlで use strict して our変数

    Perl 初心者です。初めて質問します。 test_sub.pl で宣言した変数を test_main.pl から参照したくて悩んでいます。 環境 : WindowsXP / ActivePerl 5.14.2 -------------------- * test_sub.pl -------------------- #!/usr/bin/perl use strict; our $hoge = 'HOGE'; 1; -------------------- * test_main.pl -------------------- #!/usr/bin/perl use strict; require 'test_sub.pl'; print "Content-type: text/html\n\n"; print $hoge; -------------------- これを実行すると、 Global symbol "$hoge" requires explicit package name at C:/public_html/cgi-bin/test_main.pl line 7.\r というエラーが出ます。 require する前に、test_main.pl のほうで our($hoge); と宣言したり 参照する際に print $main::hoge; とパッケージを指定したりすればいけるのですが、 これらをしないとできないものなのでしょうか。 use strict; を書かなければ最初のソースでも動くのですが use strict は書きたい… 継承のようなことをしたいのです。 ちなみに以下試してみたソースです。 -------------------- * test_main.pl -------------------- #!/usr/bin/perl ######################################## # NG use strict; require 'test_sub.pl'; print "Content-type: text/html\n\n"; print $hoge; ######################################## # OK our変数を宣言しておくといける =pod use strict; our ($hoge); require 'test_sub.pl'; print "Content-type: text/html\n\n"; print $hoge; =cut ######################################## # OK 参照する際にパッケージ名を指定すればいける =pod use strict; require 'test_sub.pl'; print "Content-type: text/html\n\n"; print $main::hoge; =cut ######################################## ######################################## # NG =pod use strict; use base qw(test_sub); print "Content-type: text/html\n\n"; print $hoge; =cut ######################################## -------------------- * test_sub.pm -------------------- #!/usr/bin/perl package test_sub; use strict; our $hoge = 'HOGE'; 1; -------------------- NG パタンはどちらも Global symbol "$hoge" requires explicit package name のエラーとなります。 もしご存じの方がいらっしゃいましたら教えてください。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • VB.NET: ファイルの二分探索のヒントを!

    1月26日より SUB MAIN() だけでVB.NET の演習をしています。 ですから、今日で一ヶ月足らずのVB.NET 初学者です。 「プログラミング言語C」の例題をVB.NETに移植するという学習法。 ELSE-IFの演習テーマは2分探索。 付属一覧.csv 品番001, 品番001用付属1, 品番001用付属2, 品番001用付属30 品番002, 品番002用付属1, 品番002用付属2, 品番002用付属300 品番003, 品番003用付属1, 品番003用付属2, 品番003用付属3000 品番004, 品番004用付属1, 品番004用付属2, 品番004用付属30000 品番005, 品番005用付属1, 品番005用付属2, 品番005用付属300000 これを配列に呼び込んで2分探索。 しかし、2分探索の本領をファイルを外に置いての探索。 ですから、演習目的は達していますが、余りにも非現実的。 そこで、外に置いたままの演習をしたいと思っています。 素人というのは、ちょっとしたヒントでも道が拓けるものです。 「このクラスを使えばできますよ!」程度のヒントでもOKです。 なお、なぜ、この質問をするのかを少し説明しておきます。 「VB.NET は何ができてもおかしくない」と思い始めているからです。 宜しくお願いします。

専門家に質問してみよう