使用泛型类型'System.Collections.Generic.IEnumerable <t>'需要1个参数</t>

时间:2014-05-23 14:51:40

标签: c# generics

   public IEnumerable<TValue> Find(IEnumerable<T> text)       

{
    var node = root;

    foreach (T c in text)
    {
        while (node[c] == null && node != root)
            node = node.Fail;

        node = node[c] ?? root;

        for (var t = node; t != root; t = t.Fail)
        {
            foreach (TValue value in t.Values)
                yield return value;
        }
    }
}

        private class Node<TNode, TNodeValue> : IEnumerable<Node<TNode, TNodeValue>>
        {
            private readonly TNode word;
            private readonly Node<TNode, TNodeValue> parent;
            private readonly Dictionary<TNode, Node<TNode, TNodeValue>> children = new Dictionary<TNode, Node<TNode, TNodeValue>>();
            private readonly List<TNodeValue> values = new List<TNodeValue>();

///根节点的构造函数。

            public Node()
            {
            }

            public Node(TNode word, Node<TNode, TNodeValue> parent)
            {
                this.word = word;
                this.parent = parent;
            }

            public TNode Word
            {
                get { return word; }
            }


            public Node<TNode, TNodeValue> Parent
            {
                get { return parent; }
            }

///失败或跌倒节点。

                public Node<TNode, TNodeValue> Fail
                {
                    get;
                    set;
                }


                public Node<TNode, TNodeValue> this[TNode c]
                {
                    get { return children.ContainsKey(c) ? children[c] : null; }
                    set { children[c] = value; }
                }


                public List<TNodeValue> Values
                {
                    get { return values; }
                }

                /// <inherit/>
                public IEnumerator<Node<TNode, TNodeValue>> GetEnumerator()
                {
                    return children.Values.GetEnumerator();
                }

                /// <inherit/>
                IEnumerator IEnumerable.GetEnumerator() //error thrown here - requires 1 type argument
                {
                    return GetEnumerator();
                }

                public override string ToString()
                {
                    return Word.ToString();
                }   
            }
        }

任何人都可以帮助解决问题。 C#相当新,不能理解我错过的东西。在其他论坛上,人们建议从Collections命名空间中删除Generic这个词,但这也不起作用

1 个答案:

答案 0 :(得分:1)

您的通用类型标识符TValueT在该范围内不存在。而不是

public IEnumerable<TValue> Find(IEnumerable<T> text)

尝试

public IEnumerable<T> Find<T>(IEnumerable<T> text)

您无法选择通用类型标识符,它们需要存在于您可以使用的范围内。 TNode和TNodeValue都会受到同样的影响,因为它们没有在相同的范围内定义。顺便说一下,你应该发布所有代码并正确格式化,因为我很难理解我是否看到你的整个此处的代码(TNodeTNodeValue是否已定义?TValueT是否已定义?root来自何处?)