【问题标题】:Extension method not found (not an assembly reference issue)未找到扩展方法(不是程序集参考问题)
【发布时间】:2012-03-06 11:19:31
【问题描述】:

我有以下扩展方法:

public static EntitySet<T> ToEntitySetFromInterface<T, U>(this IList<U> source)
    where T : class, U
{
    var es = new EntitySet<T>();
    IEnumerator<U> ie = source.GetEnumerator();
    while (ie.MoveNext())
    {
        es.Add((T)ie.Current);
    }
    return es;
}

我尝试按如下方式使用它:

   List<IItemMovement> p = new List<IItemMovement>();
    EntitySet<ItemMovement> ims = p.ToEntitySetFromInterface<ItemMovement, IItemMovement>();

ItemMovement 实现 IItemMovement 的地方。编译器抱怨:

'System.Collections.Generic.List' 不包含 'ToEntitySetFromInterface' 的定义并且没有扩展方法 'ToEntitySetFromInterface' 接受类型的第一个参数 'System.Collections.Generic.List' 可以找到(是 您缺少 using 指令或程序集引用?)

不,我没有错过参考。如果我只是键入包含该方法的静态类的名称,它就会弹出,扩展方法也是如此。谢谢

【问题讨论】:

  • 我不确定 List list = new List();会编译吗?
  • 否则代码对我有用(使用模拟的 ItemMovement 和 IItemMovement
  • 我相信这个问题与智能感知无关。如果你不能编译它,那几乎不是智能感知的错。

标签: c# linq extension-methods


【解决方案1】:

这段代码对我有用,它是您代码的直接副本,减去 ItemMovement 及其接口,所以那部分可能有问题?

public class TestClient
{
    public static void Main(string[] args)
    {
        var p = new List<IItem>();
        p.Add(new Item { Name = "Aaron" });
        p.Add(new Item { Name = "Jeremy" });

        var ims = p.ToEntitySetFromInterface<Item, IItem>();

        foreach (var itm in ims)
        {
            Console.WriteLine(itm);
        }

        Console.ReadKey(true);
    }
}

public class Item : IItem
{
    public string Name { get; set; }
    public override string ToString()
    {
        return Name;
    }
}

public interface IItem
{
}

public static class ExtMethod
{
    public static EntitySet<T> ToEntitySetFromInterface<T, U>(this IList<U> source) where T : class, U
    {
        var es = new EntitySet<T>();
        IEnumerator<U> ie = source.GetEnumerator();
        while (ie.MoveNext())
        {
            es.Add((T)ie.Current);
        }
        return es;
    }
}

【讨论】:

  • 好的。我现在真的觉得自己很傻。这不是程序集参考问题,而是使用问题。我复制了你的代码,它工作。但是当我将它复制到与上述代码相同的类文件中时,我并没有认为我通过测试是否可以调用扩展方法类 LinqExtensions 并且确实可以调用命名空间问题。所以不确定我如何在不使用完全限定的命名空间的情况下调用该类,但如果 using 没有正确声明,则无法使用扩展方法?无论哪种方式现在都完成了。谢谢。
【解决方案2】:

这部分编译器错误是关键:“没有扩展方法'ToEntitySetFromInterface'接受'System.Collections.Generic.List'类型的第一个参数”。

您的ToEntitySetFromInterface&lt;T,U&gt; 扩展方法被定义为接受IList&lt;U&gt;,但您尝试使用List&lt;T&gt; 而不是IList&lt;T&gt; 来调用它。编译器找不到您的扩展方法,因为类型不匹配。

【讨论】:

  • 您好,我不明白您所说的 List 是什么意思?我正在调用 ToEntitySetFromInterface(this IList source),因此 IList 类型由 U 的类型定义,即 IItemMovement,即 ILIst。由于 (this IList source) 确定了扩展方法可以应用于的类型,在这种情况下是 IList 和 p = IList 我不太明白你在说什么。请注意上面我有: List 但即使将其更改为 IList 我仍然遇到相同的问题/错误。
猜你喜欢
  • 1970-01-01
  • 2021-10-27
  • 2010-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-31
  • 1970-01-01
  • 2022-09-25
相关资源
最近更新 更多