- PR -

VB2005の言語仕様の落とし穴について(ソース付き)

投稿者投稿内容
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2007-04-21 09:56
現在のVB2005などのデフォルトプロパティ(C#だとインデクサ)に関しては、
C++の[]演算子オーバーロードとそう変わらないですよね?
※単に中身は引数つきプロパティである、という違いがあるだけに近い。

昔のVBのように、何も書いてないのにプロパティとして扱われるとか、
直感と違う動作にはならないでしょう。

今回のはどっちかっていうとメソッド呼び出しの()省略の弊害の方が
大きいと思うんですけどね。
※まあ今回の現象自体は両方の機能の組み合わせで発生するものではありますが。

--追記
VBの場合はメソッド呼び出しの()と、配列の添え字アクセスやインデクサの()が
同じ記号であることも原因のひとつですね。
※記述の意味にあいまい性が発生しやすい。


[ メッセージ編集済み 編集者: なちゃ 編集日時 2007-04-21 09:59 ]
ラフィン
ぬし
会議室デビュー日: 2002/05/23
投稿数: 809
お住まい・勤務地: 外野
投稿日時: 2007-04-21 10:38
 自分たちで作成したものに対してもデフォルトは設定できるのですが、デフォルトを設定してそれを使用していると何らかの都合でデフォルトを変更することになった場合に引数の属性が同じだとやばいですね。だったらそういうものは使えなくていいんじゃないかな。その方が安全かも。

 このスレッドではそういうことを考えさせられました。
object
ぬし
会議室デビュー日: 2002/03/20
投稿数: 338
お住まい・勤務地: 香川県高松市
投稿日時: 2007-04-21 10:41
objectです。

少し確認したいのですが、本当に
「デフォルトのプロパティ」
が問題なのでしょうか?

問題の部分をC#で書くと
コード:


MessageBox.Show(func()[1]); ‥‥‥ (1)
MessageBox.Show(func());


となりますよね?

そして、(1)の引数は「char」ですから、エラーとなりませんか?

※「の引数」を追加

[ メッセージ編集済み 編集者: object 編集日時 2007-04-21 10:49 ]
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2007-04-21 10:58
引用:

そして、(1)は「char」ですから、エラーとなりませんか?


確かに。

引用:

文字型 (Char) (Visual Basic) より:

拡大 Char データ型は、String に拡大されます。つまり、Char は System.OverflowException エラーにならずに String に変換できます。


などという仕様が一層の混乱を招きますね。
// Option Strict On は無視ですか。Strict じゃないじゃん!
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2007-04-21 11:40
引用:

なちゃさんの書き込み (2007-04-21 09:56) より:

VBの場合はメソッド呼び出しの()と、配列の添え字アクセスやインデクサの()が
同じ記号であることも原因のひとつですね。
※記述の意味にあいまい性が発生しやすい。


これはVBを始めた時に僕も思った。
ジェネリックの記述と言い VB は () の意味が多すぎる気がする。。。
_________________
かるあ のメモスニペット
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2007-04-21 13:13
「言語仕様の落とし穴」とはうまい表現ですね。まさに落とし穴みたいです。多くの要素が逆の意味で巧い具合に合わさっていますね。

1. メソッド呼び出しとインデクサの呼び出しがどちらも「()」
2. メソッド呼び出しの「()」が省略できる
3. Char が String に拡張される。

個人的には 2 をやらないのでハマる事はなさそうですが、人の書いたコードを見たときに混乱しそうです。というか言語仕様として 2 をなしにしてほしかった。


_________________
囚人のジレンマな日々
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-04-21 13:35
引用:

なちゃさんの書き込み (2007-04-20 20:28) より:

多分、「紛らわしい」の意味の認識が微妙に違うのでしょう。


なるほど、道理で会話が噛み合わないわけですね。
ようやく意図が理解できました。(日本語が得意でなくてすみません)

「間違えた "から" 紛らわしい」 というのは、私としては直感的でなく、
素直に 「紛らわしい "から" 間違える」 という意味で捉えていました。

引用:

私もこれではまったことは(おそらく)ないですが、これを見てややぞっとしました。
このミスをしてしまったときに、気づかない、あるいは見落とす危険があるからです。
※ミスってのはタイプミスレベルのミスの話です。


ミスした前提であれば、同意です。(私の意見は、この前提でないです)
ミスした前提ならば、コンパイラなどに手伝ってもらう他ないですからね。

# ただ、今回の例に限らず 「紛らわしい」 コードを書かないこと自体も大切です。
# という部分について曲げるという意味ではないです。

引用:

今回は記述をするしないの問題ではなくて、間違って書いてしまった場合に、
エラーにならずに意図しない動作をしてしまうという部分について、だと思います。


> どちらにしても、Func().Chars という書き方は私はしないです。
というのも、どちらかというとその 1 つ上の文にかかっている文です。
(一応、話を変えない限りはひとつのブロックで書くように気をつけています)

これも 「間違える前」 の段階の話をしているので、上記の意図を伝えても今さら意味はないですけども。

それにしても、VB って C# と違って () 演算子などの説明がないのですね。
C# と違って、そもそも言語仕様として演算子という感覚がないのかもしれませんが、
使い分けが必要だからこそ、書いておいて欲しい項だと思いますね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
object
ぬし
会議室デビュー日: 2002/03/20
投稿数: 338
お住まい・勤務地: 香川県高松市
投稿日時: 2007-04-21 13:35
objectです。

>囚人さん
私も、ほぼ同じ意見です。

言語というのは、全体として
「ヒエラルキー(階層)を構成している」
と思います。

そして、
「():ほぼトップレベルで重要な徴表」
だと思います。

そういう意味では、
「インデクサの呼び出しが:()」
も、あってはいけない事だと思います。
#「C#」が「[、]」を用いているのは、そんな軽い事ではないと私は思っています。
#プロパティを「()」で定義するのもナンセンスだと思います。
#これでは「Java」と同じです。

スキルアップ/キャリアアップ(JOB@IT)