質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

Q&A

解決済

1回答

768閲覧

VBでは配列につけた変数名と同じメソッド名は使えない?

yuyabu

総合スコア63

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

0グッド

0クリップ

投稿2018/03/24 15:54

編集2018/03/24 15:56

vbのPGを調査・解析する簡単なスクリプトを作っていました。
vb自体は詳しくなかったのですが、メソッド呼び出しと配列の参照が同じ書式であることに気がつきました。

test(1) 'testという配列の2個目の要素の参照と、testというメソッドを引数1で呼び出すの両方の意味で使えてしまう。

そこで配列と同じメソッド名を定義すればエラーになるのかと思ったのですが、エラーになりませんでした。

public class compiler shared function Main as integer Dim test = New Integer() {1, 2, 4, 8} Console.WriteLine(test(1))'2が出力される(配列が優先?) 'test(1) return 0 End function shared function test(ByVal num As Integer) Console.WriteLine ("test") End function end class

実行はpaisa.ioのvbを使いました

https://paiza.io/ja

ただし上記プログラムは5行目'test(1)
のコメントアウトを外すとエラーになります。

Visual Basic.Net Compiler version 0.0.0.5943 (Mono 4.0.1 - tarball) Copyright (C) 2004-2010 Rolf Bjarne Kvinge. All rights reserved. /workspace/Main.vb (4,13) : warning VBNC42020: Variable declaration without an 'As' clause; type of Object assumed. /workspace/Main.vb (10,18) : warning VBNC42021: Function without an 'As' clause; return type of Object assumed. /workspace/Main.vb (6,11) : error VBNC99999: Internal compiler error close to this location vbnc : Command line : error VBNC99999: Unexpected error: Value cannot be null. Parameter name: value at Mono.Cecil.Cil.Instruction.Create (OpCode opcode, System.String value) <0x40266630 + 0x0013d> in <filename unknown>:0 at Mono.Cecil.Cil.ILProcessor.Create (OpCode opcode, System.String value) <0x402665f0 + 0x00022> in <filename unknown>:0 at Mono.Cecil.Cil.ILProcessor.Emit (OpCode opcode, System.String value) <0x402665a0 + 0x00026> in <filename unknown>:0 at vbnc.EmitLog.Emit (OpCode opcode, System.String str) <0x40266540 + 0x00042> in <filename unknown>:0 at vbnc.Emitter.EmitLoadValue (vbnc.EmitInfo Info, System.String Value) <0x402664a0 + 0x00091> in <filename unknown>:0 at vbnc.LateBoundAccessToExpression.EmitLateCall (vbnc.EmitInfo Info, vbnc.LateBoundAccessClassification LateBoundAccess) <0x40266030 + 0x0024d> in <filename unknown>:0 at vbnc.InvocationOrIndexExpression.GenerateCodeInternal (vbnc.EmitInfo Info) <0x4025fcb0 + 0x00236> in <filename unknown>:0 at vbnc.Expression.GenerateCode (vbnc.EmitInfo Info) <0x40249080 + 0x00297> in <filename unknown>:0 Compilation took 00:00:00.6206770

配列とメソッド名の扱いについて調べたところ、
この事象を解説しているドキュメントなど見つかりませんでした。
これは一体何が起こっているのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

VBというよりVB.NETだと思いますが、スコープによるシャドウ(Shadow)です。
■参考情報
Visual Basic におけるシャドウ

testメソッドを呼び出したい時は以下のコードで呼び出せます。

Console.WriteLine(MyClass.test(1))

投稿2018/03/24 16:11

編集2018/03/24 20:21
umyu

総合スコア5846

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuyabu

2018/03/24 16:51 編集

回答ありがとうございます。上記クラス内ではメンバのtest()がローカルスコープの配列に上書きされた、ということが起こっているのですね。 エラーは配列だけをそのまま書いたから出たものですね。 そもそもメソッド宣言がなくてもエラーになりました。確認不足ですみません。 ところで、 同じスコープにはメソッド名と同じ変数名の配列は宣言できないのでしょうか? ``` public class compiler shared test = New Integer() {1, 2, 4, 8} 'メンバとして宣言 shared function test(ByVal num As Integer) As Integer Console.WriteLine ("test") return 0 End function shared function Main as integer Console.WriteLine(test(1)) return 0 End function end class ``` 呼び出すとエラーになりますが、呼び出さないとエラーになりませんでした。
umyu

2018/03/24 17:04

>同じスコープにはメソッド名と同じ変数名の配列は宣言できないのでしょうか? 一般的にほとんどの言語でそのような事はできませんが。どうしてできると思ったのかを教えてくださいな。
yuyabu

2018/03/24 17:08

Javaでできるのでできると思いました。 ``` private Integer test [] = {1,2,3}; private void test(Integer num){} ``` vbの方は宣言時のエラーというより、呼び出しじのエラーのように思えます。
yuyabu

2018/03/24 17:10

普通にこういうことはやりませんが、 配列とメソッドの呼び出しの書式が同じなので、何かハマらないかなと気になっただけです。
umyu

2018/03/24 17:24 編集

>yuyabuさんへ なるほど、ああ、ごめんなさい。 こういう場合の宣言は一般的にはプロパティ構文を使います。 試していませんが、Call ステートメントを使って関数と明示すれば呼び出せる気もします。 ■Callステートメント https://docs.microsoft.com/ja-jp/dotnet/visual-basic/language-reference/statements/call-statement ■Visual Basic における Me、My、MyBase、MyClass https://docs.microsoft.com/ja-jp/dotnet/visual-basic/programming-guide/program-structure/me-my-mybase-and-myclass あとここらへんを使ってみていろいろ試してみては。
yuyabu

2018/03/24 17:24

詳しい解説ありがとうございます。 こちらこそ、Javaしかわからない状態でvbを触ることになり、 色々と基礎がなっておらず申し訳ございません。
umyu

2018/03/24 17:40 編集

>yuyabuさんへ 最後に念のため。 通称としてVBと呼ばれるものが複数あります、Excel VBA、VB6、VB.NETの3種類です。 質問文のコードはVB.NETでしたが、質問文でVBと呼称してたので。 .Net Framework環境で動くもの=VB.NET 対象のソースにSub Class_Initialize関数が存在すれば…VB6 調査大変だと思いますが、頑張ってくださいな。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問