以下这段程序提示说错误 1 使用泛型 类型“System.Collections.Generic.IEnumerable<T>”需要“1”个类型

usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespa... using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication12
{
public class Tokens : IEnumerable
{
private string elements;
Tokens(string source, char deliniters)
{
elements = source.Split(deliniters);
}
public IEnumerator GetEnumerator()
{
return new TokenEnumerator(this);
}
private class TokenEnumerator : IEnumerator
{
private int position = -1;
private Tokens t;
public TokenEnumerator(Tokens t)
{
this.t = t;
}
public bool MoveNext()
{
if (position < t.elements.Length - 1)
{
position++;
return true;
}
else
{
return false;
}
}
public void Reset()
{
position = -1;
}
public object Current
{
get
{
return t.elements;
}
}
}
}
class Program
{
static void Main(string[] args)
{
Tokens f = new Tokens("This is well-done program.", new char { ' ', '-' });
foreach (string item in f)
{
Console.WriteLine(item);
}
}
}
}
求大神指点如何修改?
展开
 我来答
makosharp
2013-06-04 · TA获得超过676个赞
知道小有建树答主
回答量:188
采纳率:100%
帮助的人:270万
展开全部

在给你贴完整的修正代码之前我要指出几个严重的问题.

  1. 明显可以看出你要的是Tokens类维护一个string集合(依你的需求string[]足矣),也就是elements,那么在指示Tokens继承集合接口IEnumrable时应使用IEnumrable<string>做标记.

  2. IEnumrable<string>接口要求实现public IEnumerator<string> GetEnumerator()和System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()两个方法,出于资源复用和节省开销等因素,该枚举器应来源于Tokens类中的私有成员,而不是像你的代码一样每次新建一个枚举器;同理,新建枚举器是无法保存当前位置(position)的,除非再次浪费资源传进去.通用的做法是在Tokens中声明private TokenEnumrator elementEnumrator,并且在Tokens构造时就将该elementEnumrator初始化.

  3. 其他的小问题.string应该是string[]或者List<string>; 还有new char { ' ', '-' }太让人费解了,将Tokens的构造写成Tokens(string source,param char[] deleniters)更符合你的需求....etc...

  4. 最后也是最重要的一点,泛型让一切集合操作变得如此简单,既然框架已经提供了各种现有的强大的类,能用就尽量用吧.说实在的,自己重写枚举器我1年都不会写超过一次,你的例子很简单,一个List<T>搞定.如果需要干涉其枚举器,就通过GetEnumrator<T>方法取出来自己操作,更复杂的情况下,请override相关方法,免得自己实现每一个接口方法费时费力.


你要的代码见下,已调试.这是改动最小的情况下,不是最优代码:

 public class Tokens : IEnumerable<string>

    {

        private string[] elements;

        private TokenEnumrator enumrator;

        public Tokens(string source, params char[] deleniters)

        {

            elements = source.Split(deleniters);

            enumrator = new TokenEnumrator(elements);

        }


        public IEnumerator<string> GetEnumerator()

        {

            return enumrator;

        }


        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()

        {

            return enumrator;

        }


        class TokenEnumrator : IEnumerator<string>

        {

            string[] elements;

            int position = -1;

            public TokenEnumrator(string[] elements)

            {

                this.elements = elements;

            }


            public string Current

            {

                get { return position == -1 ? null : elements[position]; }

            }


            public void Dispose()

            {


            }


            object System.Collections.IEnumerator.Current

            {

                get { return position == -1 ? null : elements[position]; }

            }


            public bool MoveNext()

            {

                if (position < elements.Length - 1)

                {

                    position++;

                    return true;

                }

                else

                    return false;

            }


            public void Reset()

            {

                position = -1;

            }

        }

    }


    class Program

    {

        static void Main(string[] args)

        {

            Tokens f = new Tokens("This is well-done program.", ' ', '-');

            foreach (string item in f)

            {

                Console.WriteLine(item);

            }

            Console.ReadKey();

        }

    }


QQ176229432 欢迎骚扰

追问
我去,大神。。谢谢啦。。
追答
...我正在修改回答来着...
楼上说的加一个System.Collentions空间引用的方法是通用且可行的,但是我个人强烈建议使用泛型标示至少IEnumrable,方便代码规整,而且在使用其枚举器IEnumrator时可以明确的知道其维护的元素的类型.
最典型的例子: f.GetEnumerator().Current不使用泛型IEnumrable时只会返回object,有时候代码多脑子乱还要去看Tokens是怎么写的...还不如用IEnumrable,直接得到T类型的值.
个人建议而已...请随便看看
百度网友a175029de
2013-06-04 · TA获得超过287个赞
知道小有建树答主
回答量:211
采纳率:0%
帮助的人:244万
展开全部
你是用的是泛型接口,需要指定泛型参数类型,把类声明改为:
public class Tokens<String> : IEnumerable<T>
第二个类估计也得改成这样,还有,你第一个类中的字段应该是String[]类型吧
追问
额。。能给个修改完成的么?。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
dotabade
2013-06-04 · 超过14用户采纳过TA的回答
知道答主
回答量:47
采纳率:0%
帮助的人:42.4万
展开全部
我勒个去。。 明显是这个问题。接口IEnumerable<out T>是在System.Collections.Generic这个命名空间的,楼主你使用的IEnumerable是在命名空间System.Collections。你只引用了System.Collections.Generic命名空间是没有这个IEnumerable这个接口的只有IEnumerable<out T>接口,当然就报System.Collections.Generic.IEnumerable<T>”需要“1”个类型。。。。。。引用System.Collections这个命名空间就ok,具体泛型什么的你这里还不需要用到吧。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
120197588
2013-06-04 · TA获得超过146个赞
知道答主
回答量:416
采纳率:100%
帮助的人:99.7万
展开全部
亲 你这应该是少了命名空间了。 using System.Collections.Generic;
你把鼠标放在出错代码上---鼠标右键----解析。 就行了。
追问
额。。这个应该有吧。。你看我的第二行。。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式