質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

3回答

2226閲覧

C#のジェネリックについて

nscut

総合スコア9

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2021/06/20 08:19

編集2021/06/20 12:27

お世話になります。
C#を学習中の者です。
「独習C#」という本にて、

■任意の型の要素を持つリストを引数に受け取って、その内容をカンマ区切りの文字列でコンソールに出力するPrintListメソッド(静的なジェネリックメソッド)を作成せよ。

という問題があります。
回答は下記の通りですが、自環境だとToArray()の箇所で
「'List<T>' に の定義が含まれておらず、型 'List<T>' の最初の引数を受け付けるアクセス可能な拡張メソッド が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足していないことを確認してください。」
のエラーが表示されます。

回答にはこの記載以外の説明がなく困っています。
よければご助言いただけないでしょうか?

よろしくおねがいします。

■本の回答

C#

1    static void PrintList<T>(List<T> list) 2 { 3 Console.WriteLine(String.Join(",",list.ToArray())); 4 }

■自環境のコード

C#

1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Text; 5using System.Threading.Tasks; 6using System.IO; 7 8 9namespace SelfCSharp 10{ 11 class UsingStatic 12 { 13 static void Main(string[] args) 14 { 15 } 16 } 17 18 public class List<T> 19 { 20 static void PrintList<T>(List<T> list) 21 { 22 Console.WriteLine(String.Join(",",list.ToArray())); 23 } 24 25 } 26}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gentaro

2021/06/20 09:29

質問文に書いてあるコードが信用できない。(実際usingを編集してる→あなたが必要だと思って抽出してる箇所に実際に不備があった) その現象が発生する実際のコードで、他人の環境にコピペしてすぐ動作させる事ができるレベルのものを提示すべき。 新規に作ったコンソールアプリのprogram.csにちょっと足したレベルならそのまま全部貼れば良いだけ。
退会済みユーザー

退会済みユーザー

2021/06/20 09:55 編集

何を情報として提供すればわからない初心者の判断でコードを削らなようにしましょう。問題を再現できる必要最低限まで削って(回答者の方でもコピペすれば問題を再現できる程度に)それをアップするということなら是非やってほしいけど、質問に書かれたコードは問題外です。それが分からないのでしょうが、それでは文章でやりよりするここのような Q&A サイトでは話が通じないです。
pepperleaf

2021/06/20 11:46

手元の環境 (Visual studio 2019)だと、提示のコードでエラーは出ません。 エラーの出た環境、エラーコードはどうなっていますか? 直接、関係は無いと思いますが、全角スペースが文字列以外で使われています。プログラム中では、半角英数のみとした方がトラブルは少ないと思います。
Zuishin

2021/06/20 12:11

エラーが出るソースと同じものではないようなので実際にはどんな間違いをしているのか知りませんが、メモ帳でなく Visual Studio を使えば一発でわかると思います。
Zuishin

2021/06/20 12:41

> 自環境だとToArray()の箇所で ここすら違うとか。
guest

回答3

0

SelfCSharp.List<T>を新しく作成している為、エラー発生行のクラスが、新規作成のSelfCSharp.List<T>となり、System.Collections.Generic.List<T>が使われておりません。

該当行のList<T>が、SelfCSharp.List<T>の場合、SelfCSharp.List<T>のメソッドString[] ToArray()などを、作成してください。

そうではなく、System.Collections.Generic.List<T>の場合、直上の宣言で、「List<T>」と省略せずに、「System.Collections.Generic.List<T>」で宣言して下さい。

このような問題が発生する為、SelfCSharp.List<T>ではなく、SelfList<T>などと、他のクラスと重ならないようなクラス名を使うことをお勧めします。

投稿2021/06/21 01:32

YT0014

総合スコア1708

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nscut

2021/06/21 02:25

ご教授いただきありがとうございます。 参考にさせていただきます。
YT0014

2021/06/21 03:39

今回のように、コンパイルエラーの原因が該当行に存在しない場合もあります。その為、質問の際には、コンパイルエラーなら、コンパイルでき、かつ、同一のエラーが発生するコードをご提示ください。
guest

0

多分、ジェネリックが問題ではなく、Listが問題では?

公式によると、

名前空間:System.Collections.Generic

とあります。


[追記1]

いやいや、わかるか!!! んなもん!!!!
……って思わずツッコミたくなった。
最初の質問では単にListを『使っているところだけ』で
実際は『新たに別のListを自作していたから』とか、
わかるわけないでしょ……と思いますね。

なぜエラーが出るのかはスコープとnamespaceを理解できていれば簡単にわかりますよ。

例えば複数の人で一つの作品を作る場合、
同じ名前のクラスとかを作ってしまう可能性があります。
そこで、namespaceって言うものにくるめば、
○○の■■っていう風に『識別できる』のです。

詳しくはご自分で調べてください。

たとえば、ある村に太郎と言うひとが3人ほどいるとします。
そこである別の人に「太郎を呼んできておくれ」とお願いしても、
どちらの太郎かわかりません。

それで、『名字』や『屋号』、『役職名』等をつけるとどうでしょうか。

わかりやすく、識別できますね。

それがnamespace。

usingディレクティブによるアレは、
『名字を外した状態』のようなものです。

今回も、Listが自作の方と既に提供されている方の2つがバッティングしているため、
コンパイラが『えーっと……僕はどっちを呼べばいいの……??』
と混乱しているのです。

なので、今回のような場合はフルネームで呼び出すのです。

投稿2021/06/20 08:26

編集2021/06/21 02:26
BeatStar

総合スコア4958

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nscut

2021/06/20 08:36

BeatStar様 ご回答いただきありがとうございます。 いただいた名前空間はインポートしておりました。 情報が漏れており申し訳ございませんでした。
y_waiwai

2021/06/20 11:30

なら質問文を修正し、正しいコードを提示しようよ
guest

0

自己解決

大変申し訳ございません、クラス名から<T>を削除したらエラーが消えました。
ご指摘いただいた皆様、ありがとうございました。

投稿2021/06/20 12:30

nscut

総合スコア9

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YT0014

2021/06/21 01:23

クラス名がどれを示すのが不明瞭なので、実際の修正方法が確定できません。 また、原因の把握ができておらず、正しい修正になっていません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問