none
ジェネリック 型 'System.Collections.Generic.IEnumerator<T>' の使用 がよくわかりません。 RRS feed

  • 質問

  • ↓のリンクで、試したのですが、解りません。

    http://msdn.microsoft.com/ja-jp/academic/cc998633.aspx

    エラー 10 ジェネリック 型 'System.Collections.Generic.IEnumerator<T>' の使用には、'1' 型の引数が必要です。 D:\My Documents\Visual Studio 2005\Projects\MSDNAA\MSDNAA\Form1.cs 43 13 MSDNAA

    というエラーが出て、これは.Netの初心者だからだと自分がそうなんだと諦めきれません。

    よろしくご指導のほどお願いします。

    2010年4月11日 8:35

回答

  • 多分、ソースファイル冒頭の using の中に、

    using System.Collections;

    が抜けているのが原因かと。

    デフォルトのテンプレートファイルには、上記名前空間は using されていませんが System.Collections.Generic 名前空間は using されています。

    System.Collections 名前空間には IEnumerator インターフェイスが定義されており、System.Collections.Generic 名前空間には IEnumerator<T> インターフェイスが定義されています。

    本来クラス名には System.Collections.IEnumerator とか System.Collections.Generic.IEnumerator<int> といった記述が必要ですが、毎回それだと長すぎるので、ソースファイル冒頭で using することで、その名前空間の記述は省略することができるようになります。

    で、System.Collections.Generic が using されていて System.Collections が using されていないと、IEnumerator という名前が出てきたとき「これは System.Collections.Generic.IEnumerator のことだな」とコンパイラは判断します。で、System.Collections.Generic.IEnumerator は ジェネリック型のため、IEnumerator<何かの型> という記述が必須になり、この「何かの型」が書かれてないよ、というエラーになります。

    System.Collections が using されているなら、IEnumerator という型が出てきたとき、<何かの型>が書かれていないのでジェネリック型ではない=System.Collections.Generic.IEnumerator ではない、と判断できるので、System.Collections の方の IEnumerator であることが自明と言うことになります。

    • 回答としてマーク 菊地俊介 2010年4月20日 8:01
    2010年4月11日 9:27
  • 名前空間System.Collections.GenericのIEnumeratorが使われてしまっているので、System.CollectionsのIEnumeratorを使うようにして下さい。リンク先のサンプルはまだジェネリックが導入される前の、おそらくVS2003のサンプルでしょう。
    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク 菊地俊介 2010年4月20日 8:01
    2010年4月11日 9:34
    モデレータ
  • 参考にされているサンプルはかなり古いですね(.NET, C# とも初期
    版に近いもの?)。

    古いから動かないというわけではないですが、.NET2.0 の新しいクラ
    スライブラリ(WebBrowser クラスなど。下記リンク参照)、C#2.0
    で使えるようになったジェネリック型を使って、サンプルを書き換え
    てみてはいかがでしょう?

    WebBrowser クラス
    http://msdn.microsoft.com/ja-jp/library/system.windows.forms.webbrowser(VS.80).aspx

    HtmlDocument クラス
    http://msdn.microsoft.com/ja-jp/library/system.windows.forms.htmldocument(v=VS.80).aspx

    そうすれば、Visual Studio の機能を生かして、労力は少なく、コー
    ドももっと簡単に書け、間違いも少なくなるはずです。

    また、COM コンポーネントは使い方のドキュメントを見つけるにも苦
    労しますが、.NET Framework のクラスライブラリなら、親切丁寧に
    使い方を解説したドキュメント、Web ページが多数見つかるというメ
    リットもあります。

    SHDocVw.dll などの使い方を勉強しているとか、互換性の問題があっ
    て新しいバージョンは使えないということでしたら失礼しました。

    • 回答としてマーク 菊地俊介 2010年4月20日 8:01
    2010年4月13日 12:57
  • using System.Collections;

    を追記したら、エラーはでなくなり、解決しました。

    ありがとうございました。

    2010年4月27日 11:49

すべての返信

  • 多分、ソースファイル冒頭の using の中に、

    using System.Collections;

    が抜けているのが原因かと。

    デフォルトのテンプレートファイルには、上記名前空間は using されていませんが System.Collections.Generic 名前空間は using されています。

    System.Collections 名前空間には IEnumerator インターフェイスが定義されており、System.Collections.Generic 名前空間には IEnumerator<T> インターフェイスが定義されています。

    本来クラス名には System.Collections.IEnumerator とか System.Collections.Generic.IEnumerator<int> といった記述が必要ですが、毎回それだと長すぎるので、ソースファイル冒頭で using することで、その名前空間の記述は省略することができるようになります。

    で、System.Collections.Generic が using されていて System.Collections が using されていないと、IEnumerator という名前が出てきたとき「これは System.Collections.Generic.IEnumerator のことだな」とコンパイラは判断します。で、System.Collections.Generic.IEnumerator は ジェネリック型のため、IEnumerator<何かの型> という記述が必須になり、この「何かの型」が書かれてないよ、というエラーになります。

    System.Collections が using されているなら、IEnumerator という型が出てきたとき、<何かの型>が書かれていないのでジェネリック型ではない=System.Collections.Generic.IEnumerator ではない、と判断できるので、System.Collections の方の IEnumerator であることが自明と言うことになります。

    • 回答としてマーク 菊地俊介 2010年4月20日 8:01
    2010年4月11日 9:27
  • 名前空間System.Collections.GenericのIEnumeratorが使われてしまっているので、System.CollectionsのIEnumeratorを使うようにして下さい。リンク先のサンプルはまだジェネリックが導入される前の、おそらくVS2003のサンプルでしょう。
    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク 菊地俊介 2010年4月20日 8:01
    2010年4月11日 9:34
    モデレータ
  • 確かに、冒頭に

    using System.Collections;

    がなかったです。

    Visual Studio 2005 C#,VB  からしか.Netは知らないので、

    Visual Studio 6.0 VB.VCの延長上に勉強してきたので、確かにわからなかったです。

    ただ、ビルドはうまくいくのですが、実行してみても、思ったようには、ボタンを押しても、何も表示されないです。

    左上のテキストボックスに、パスを入力しても、何にも起こらないです。

    すいませんでした。

    2010年4月12日 16:52
  • 確かに、冒頭に

    using System.Collections;

    がなかったです。

    Visual Studio 2005 C#,VB  からしか.Netは知らないので、

    Visual Studio 6.0 VB.VCの延長上に勉強してきたので、確かにわからなかったです。

    ただ、ビルドはうまくいくのですが、実行してみても、思ったようには、ボタンを押しても、何も表示されないです。

    左上のテキストボックスに、パスを入力しても、何にも起こらないです。

    すいませんでした。

    2010年4月12日 16:53
  • 参考にされているサンプルはかなり古いですね(.NET, C# とも初期
    版に近いもの?)。

    古いから動かないというわけではないですが、.NET2.0 の新しいクラ
    スライブラリ(WebBrowser クラスなど。下記リンク参照)、C#2.0
    で使えるようになったジェネリック型を使って、サンプルを書き換え
    てみてはいかがでしょう?

    WebBrowser クラス
    http://msdn.microsoft.com/ja-jp/library/system.windows.forms.webbrowser(VS.80).aspx

    HtmlDocument クラス
    http://msdn.microsoft.com/ja-jp/library/system.windows.forms.htmldocument(v=VS.80).aspx

    そうすれば、Visual Studio の機能を生かして、労力は少なく、コー
    ドももっと簡単に書け、間違いも少なくなるはずです。

    また、COM コンポーネントは使い方のドキュメントを見つけるにも苦
    労しますが、.NET Framework のクラスライブラリなら、親切丁寧に
    使い方を解説したドキュメント、Web ページが多数見つかるというメ
    リットもあります。

    SHDocVw.dll などの使い方を勉強しているとか、互換性の問題があっ
    て新しいバージョンは使えないということでしたら失礼しました。

    • 回答としてマーク 菊地俊介 2010年4月20日 8:01
    2010年4月13日 12:57
  • using System.Collections;

    を追記したら、エラーはでなくなり、解決しました。

    ありがとうございました。

    2010年4月27日 11:49