- - PR -
VB2005の言語仕様の落とし穴について(ソース付き)
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-04-21 09:56
現在のVB2005などのデフォルトプロパティ(C#だとインデクサ)に関しては、
C++の[]演算子オーバーロードとそう変わらないですよね? ※単に中身は引数つきプロパティである、という違いがあるだけに近い。 昔のVBのように、何も書いてないのにプロパティとして扱われるとか、 直感と違う動作にはならないでしょう。 今回のはどっちかっていうとメソッド呼び出しの()省略の弊害の方が 大きいと思うんですけどね。 ※まあ今回の現象自体は両方の機能の組み合わせで発生するものではありますが。 --追記 VBの場合はメソッド呼び出しの()と、配列の添え字アクセスやインデクサの()が 同じ記号であることも原因のひとつですね。 ※記述の意味にあいまい性が発生しやすい。 [ メッセージ編集済み 編集者: なちゃ 編集日時 2007-04-21 09:59 ] | ||||||||||||
|
投稿日時: 2007-04-21 10:38
自分たちで作成したものに対してもデフォルトは設定できるのですが、デフォルトを設定してそれを使用していると何らかの都合でデフォルトを変更することになった場合に引数の属性が同じだとやばいですね。だったらそういうものは使えなくていいんじゃないかな。その方が安全かも。
このスレッドではそういうことを考えさせられました。 | ||||||||||||
|
投稿日時: 2007-04-21 10:41
objectです。
少し確認したいのですが、本当に 「デフォルトのプロパティ」 が問題なのでしょうか? 問題の部分をC#で書くと
となりますよね? そして、(1)の引数は「char」ですから、エラーとなりませんか? ※「の引数」を追加 [ メッセージ編集済み 編集者: object 編集日時 2007-04-21 10:49 ] | ||||||||||||
|
投稿日時: 2007-04-21 10:58
確かに。
などという仕様が一層の混乱を招きますね。 // Option Strict On は無視ですか。Strict じゃないじゃん! | ||||||||||||
|
投稿日時: 2007-04-21 11:40
これはVBを始めた時に僕も思った。 ジェネリックの記述と言い VB は () の意味が多すぎる気がする。。。 _________________ かるあ のメモ と スニペット | ||||||||||||
|
投稿日時: 2007-04-21 13:13
「言語仕様の落とし穴」とはうまい表現ですね。まさに落とし穴みたいです。多くの要素が逆の意味で巧い具合に合わさっていますね。
1. メソッド呼び出しとインデクサの呼び出しがどちらも「()」 2. メソッド呼び出しの「()」が省略できる 3. Char が String に拡張される。 個人的には 2 をやらないのでハマる事はなさそうですが、人の書いたコードを見たときに混乱しそうです。というか言語仕様として 2 をなしにしてほしかった。 _________________ 囚人のジレンマな日々 | ||||||||||||
|
投稿日時: 2007-04-21 13:35
なるほど、道理で会話が噛み合わないわけですね。 ようやく意図が理解できました。(日本語が得意でなくてすみません) 「間違えた "から" 紛らわしい」 というのは、私としては直感的でなく、 素直に 「紛らわしい "から" 間違える」 という意味で捉えていました。
ミスした前提であれば、同意です。(私の意見は、この前提でないです) ミスした前提ならば、コンパイラなどに手伝ってもらう他ないですからね。 # ただ、今回の例に限らず 「紛らわしい」 コードを書かないこと自体も大切です。 # という部分について曲げるという意味ではないです。
> どちらにしても、Func().Chars という書き方は私はしないです。 というのも、どちらかというとその 1 つ上の文にかかっている文です。 (一応、話を変えない限りはひとつのブロックで書くように気をつけています) これも 「間違える前」 の段階の話をしているので、上記の意図を伝えても今さら意味はないですけども。 それにしても、VB って C# と違って () 演算子などの説明がないのですね。 C# と違って、そもそも言語仕様として演算子という感覚がないのかもしれませんが、 使い分けが必要だからこそ、書いておいて欲しい項だと思いますね。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||
|
投稿日時: 2007-04-21 13:35
objectです。
>囚人さん 私も、ほぼ同じ意見です。 言語というのは、全体として 「ヒエラルキー(階層)を構成している」 と思います。 そして、 「():ほぼトップレベルで重要な徴表」 だと思います。 そういう意味では、 「インデクサの呼び出しが:()」 も、あってはいけない事だと思います。 #「C#」が「[、]」を用いているのは、そんな軽い事ではないと私は思っています。 #プロパティを「()」で定義するのもナンセンスだと思います。 #これでは「Java」と同じです。 |