【问题标题】:Overridden Extension Method Requires Assembly Reference [duplicate]覆盖的扩展方法需要程序集参考
【发布时间】:2015-02-10 21:12:20
【问题描述】:

这看起来很奇怪,除非我遗漏了什么......

public static string ToDomainSolarSystemCelestial(this TypeMapper<string> m)
{
    // Does not reference any other assemblies - straight string to string mapping.
    return m.Source
}

public static Universe.SolarSystemCelestial ToDomainSolarSystemCelestial(this TypeMapper<Db.SolarSystemCelestial> m)
{
     // Maps between a database and business object. 
     // Requires a reference to the Db assembly.
     return new Universe.SolarSystemCelestial()
     {
         Id = m.Source.Id,
         // etc
     }
}

这两种扩展方法都定义在同一个类中。第二个覆盖需要知道 Db.SolarSystemCelestial 是什么,因此它需要对包含程序集的引用。但是第一个是直接的字符串到字符串的映射。

如果我这样做......

var x = Mapper.Map("x").ToDomainSolarSystemCelestial();

.. 使用没有依赖的重载,Visual Studio 会报错如下信息:

The type Db.SolarSystemCelestial is not defined in an assembly that is referenced. You must add a reference to assembly Db, Version 1.0.0.0...

如果我更改其中一种方法的名称,问题就会消失。除了改名还有什么办法解决吗?理想情况下,我希望覆盖具有相同的名称但处理不同的类型。

谢谢。

注意:关于查找未引用的程序集存在一些问题,但在这种情况下,我询问的是扩展方法的编译,而不仅仅是缺少的程序集引用。

【问题讨论】:

  • 编译器需要确定要使用哪个重载,因此它需要引用在任何重载的签名中使用的任何类型。
  • 更改方法的名称不会解决此问题。该错误与缺少参考有关。
  • 添加对引用的外部程序集的引用,如果需要编译代码。
  • @Dbugger - 我认为这听起来正确且有道理。
  • @dbugger 您的评论应该是公认的答案。

标签: c# .net generics .net-4.5 extension-methods


【解决方案1】:

Universe.SolarSystemCelestial 的基类是什么?

这与返回类型有关,或者返回类型位于不同的程序集中,或者它的基类型之一,或者它公开公开的类型在另一个程序集中。

编辑:

用额外的 cmets 再次阅读问题后,问题如 @dbugger 所述

一种解决方法是将扩展方法放在不同的命名空间中,并在调用代码时只添加您需要的命名空间。所以编译器只看到一个。

【讨论】:

  • Universe.SolarSystemCelestial 里面只有框架类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-07
相关资源
最近更新 更多