【问题标题】:Writing a generic method and the compiler expects T to be a known type [duplicate]编写泛型方法并且编译器期望 T 是已知类型 [重复]
【发布时间】:2015-06-10 18:07:12
【问题描述】:

我正在编写一个通用的扩展方法。编译器不接受我的泛型参数。编译器消息是

找不到类型或命名空间名称“T”(您是否缺少 using 指令或程序集引用?

有人可以指出我应该做些什么不同的事情吗?这是代码

public static class IEnumerableExtensionMethods
{
  public static Stack<T> ToStack(this IEnumerable<T> source)
  {
     var reversed = source.Reverse();
     if(source is ICollection<T>)
        return new Stack<T>(reversed);

     var returnStack = new Stack<T>(reversed.Count);
     foreach (T item in reversed)
        returnStack.Push(item);

     return returnStack;
  }
}

【问题讨论】:

  • 你的整个方法体可以是return new Stack&lt;T&gt;(source.Reverse());。无需手动插入每个项目。
  • 我会试试的。我把条件放在那里,因为 source 是 IEnumerable 并且 Stack(param) 上的文档说 param 是 ICollection。
  • @philogon 不,参数是IEnumerable&lt;T&gt;,而不是ICollection&lt;T&gt;
  • 抱歉重复了。在我撰写问题时,他们都没有出现。 (我确实看过。)
  • 文档 /does/ 说 IEnumerable。我只是读得太快了之类的。

标签: c# generics


【解决方案1】:

你的方法签名需要一个类型参数:

public static Stack<T> ToStack<T>(this IEnumerable<T> source)

作为旁注,一旦你修复它,它就不会编译。你需要在IEnumerable上调用Count()方法:

var returnStack = new Stack<T>(reversed.Count());

正如@Servy 在 cmets 中指出的那样,检查这是否是 ICollection&lt;T&gt; 不是必需的;有一个Stack&lt;T&gt; 构造函数接受IEnumerable&lt;T&gt;。你可以使用:

new Stack<T>(source.Reverse());

改为。

【讨论】:

  • 好的。出于某种原因,当我阅读文档时,我认为它只接受 ICollections。我一定是读得太快了(因为我在工作时不会这样做)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-22
  • 2011-09-07
  • 1970-01-01
  • 1970-01-01
  • 2019-12-30
  • 1970-01-01
相关资源
最近更新 更多