我们不能为不同的类提供相同名称的扩展方法吗?

时间:2013-10-24 07:37:56

标签: c# .net extension-methods

我有两个这样的扩展方法..

一个是

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

   }

第二个是

 public static BsonValue TopOne(this BsonValue IEnumBv)
 {

 }

这不可能吗?我没有理由。

甚至名称是相同的,但它对于不同的扩展方法是对的吗?

或者如何实现这一目标?我需要两个扩展名的topone名称。这可能吗?

更新

我收到此错误

  

以下方法或属性之间的调用不明确:&#39; BsonExtensionLibrary.MongoExtensions.TopOne(MongoDB.Bson.BsonValue)&#39;和&#39; BsonExtensionLibrary.MongoExtensions.TopOne(System.Collections.Generic.IEnumerable)

1 个答案:

答案 0 :(得分:8)

您绝对可以这样做 - 但如果您尝试在BsonValue IEnumerable<BsonValue>的某些内容上调用扩展方法,则会遇到问题。例如:

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

您希望调用哪种方法?两者都适用,两种转换都不比另一种好。

请注意,这与扩展方法无关 - 它只是重载解析。如果这些是普通的静态方法,你会遇到完全相同的问题,并且你有:

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

要么给这两种方法赋予不同的名称,要么找到一种表达你想要的方式,例如

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

(那是使用Enumerable.AsEnumerable扩展方法 将表达式类型转换为IEnumerable<BsonValue>。)