2012-01-11 14 views
2

C#の仕様はおそらくそう言いますが、私の検索で何も表示されませんでしたが、それは私が探している答えではありません。なぜC#は明示的にオペレータまたはプロパティアクセサを呼び出すことができませんか?

オペレータメソッド(op_Additionなど)またはプロパティアクセサー(get_Lengthなど)を直接呼び出すことは、悪い考えであることを示すシナリオを探しています。 C#言語の設計者がそれをやめさせるのに十分ではありません。compiler error CS0571を参照してください)

この能力を持たせることが有用である一般的なシナリオは、Func<T>デリゲートがプロパティの値を返す場所です。 getアクセサーをデリゲートのメソッドにすることもできません。単純な回避策(() => someObject.SomePropertyを使用)がありますが、オーバーヘッドを除いても、someObject.get_SomePropertyほど明確ではありません。

タイプが複数の異なる型への複数の変換を定義すると、メソッドは異なる戻り型で同じシグネチャを持つことになります。これはC#ではどちらも許可されません。しかしそれはdifferent questionです。

+2

たとえば、この回答を参照してください。すべての機能にはコストがあります。 http://stackoverflow.com/a/4914207/161457 – TrueWill

+0

@TrueWillそれを拒否する独自のコンパイル時エラーを生成する機能もあります。だから、なぜ許可するコストは、許可しないことのコストよりも大きいと考えられたのですか? –

+0

'()=> someObject.SomeProperty'は' someObject.get_SomeProperty'と同じではありません。最初は、プロパティを返す無名関数です。 2つ目はプロパティのgettor関数そのものです(カッコなしの式で使用すると、その関数にデリゲートを返すことが期待されます)。 – Abel

答えて

1

デザイナー(アンダーズ)がそれをサポートしない理由はわかりませんが、ここで私が思いついた理由はいくつかあります。

  1. これは、プロパティのゲッターのデフォルト名は、(それはそれは標準のコンパイラ、アセンブリの場合である必要はありません)get_PropertyNameであることを知らない初心者に混乱するでしょう。

  2. あなたはおそらく、この慣習を決して使用しないいくつかのjava-ophilesを持っています。

  3. クラスデザイナーが望む(意味がある)場合は、Addメソッド(DateTime.Addなど)を使用できます。それははるかにフレンドリーな名前です。

+0

アイデアありがとう。しかし、これらのどれも、それを信じるのに十分なほど強力ではありません。 1.特別な名前はIntelliSenseから隠される可能性があります(そして今でも存在しています)ので、これは問題ではないと思います。 2.それは、それを使用したいと思う人々のことです。 3.オペレータを定義する場合は、v1.0から対応する「通常の」メソッドを追加することが推奨されています。彼らはどのオペレータにどの名前を使用するか指定していました。 –

関連する問題