3

このような2つの拡張メソッドがあります..

一つは

   public static BsonValue TopOne(this IEnumerable<BsonValue> IEnumBv)
   {

   }

二つ目は

 public static BsonValue TopOne(this BsonValue IEnumBv)
 {

 }

これは不可能ですか?理屈が通らない。

名前も同じですが、異なる拡張メソッドですよね?

またはこれを達成する方法は?両方の拡張機能に名前を付ける必要があります。それは可能ですか?

アップデート

このエラーが発生しています

次のメソッドまたはプロパティ間の呼び出しがあいまいです: 'BsonExtensionLibrary.MongoExtensions.TopOne(MongoDB.Bson.BsonValue)' と 'BsonExtensionLibrary.MongoExtensions.TopOne(System.Collections.Generic.IEnumerable)

4

1 に答える 1

10

これは絶対にできますが、 aBsonValue an の両方である何かに対して拡張メソッドを呼び出そうとすると、問題が発生しますIEnumerable<BsonValue>。例えば:

BsonArray array = ...;
BsonValue top = array.TopValue();

どのメソッドが呼び出されると思いますか? どちらも適用可能であり、どちらの変換も他よりも優れていません。

これは実際には拡張メソッドとは何の関係もないことに注意してください。これは単なるオーバーロードの解決です。それらが通常の静的メソッドであり、次の場合はまったく同じ問題に直面します。

BsonArray array = ...;
BsonValue top = BsonHelpers.TopValue(array);

2 つのメソッドに異なる名前を付けるか、必要なものを表現する方法を見つけてください。

BsonArray array = ...;
BsonValue topAsEnumerable = array.AsEnumerable().TopValue();
BsonValue topAsValue = ((BsonValue) array).TopValue();

(これは、式の型を に変換するためだけEnumerable.AsEnumerableに拡張メソッドを使用しています。)IEnumerable<BsonValue>

于 2013-10-24T07:42:28.613 に答える