2011-01-21 10 views
-2

なぜ次のコードが機能しないのですか?Genericでのエラー

public void getData<T>(T ConnectionStirng) 
{ 
    OleDbConnection con = new OleDbConnection(connectionString); \\compile error 
} 
+2

は、そのソースコードであるか、単にこれを入力したのですか? – BrokenGlass

+0

また、コメントスラッシュは間違った方法です。編集前にこれを修正してから、おそらくそれがあなたが直面している問題の一部です。 :) – stakx

+0

なぜここにジェネリック薬を使用していますか? –

答えて

7

connectionStringは、文字列ではなく、Tでなければなりませんので。

OleDbConnectionクラスは唯一の2つのコンストラクタがあります。

OleDbConnection() // Empty parameter list 

OleDbConnection(string connectionString) // takes a connection string 

あなたは型Tのオブジェクトを渡すことを試みることによって、コンパイル

を、コンパイラは何を知っているための方法はありません(それがその時点で文脈で使用されていないので)タイプです。

したがって、Tは文字列であることが保証されていないため、呼び出すパラメータに一致するOleDbConnectionのオーバーロードはありません。

この場合、戻り値はなく、connectionStringはstring型でなければならないため、ジェネリックスはまったく必要ありません。

public IEnumerable<T> getData<T>(string connectionString) 

編集

public void getData(string connectionString) 

あなたはタイプTのデータのコレクションを返すようにしようとしている場合を除き、それは次のようになりますように、それは簡単に書き込むことができます。あなたのパラメータ名があなたがコンストラクタに渡そうとしているものと一致しないという事実、またはあなたのコメント内のスラッシュが後方にあるという事実に対処していません。

+1

正しいコードは何ですか? – visual2020

+0

@ visual2020、もしあなたが*この答えを読んだら、あなたは正しいコードを推測できるはずです。 – stakx

+0

+1!これは実際に私を笑顔にしました。 :) –

0

OleDbConnectionのコンストラクターは文字列を取ります。

+0

正しいコードは何ですか? – visual2020

3

OleDbConnectionオブジェクトは、文字列を期待して、あなたが実際にジェネリックを必要としないコードを見てみるとT.

を通過してきたので。確かにこれで十分です:

public void getData(string connectionString) 
{ 
    OleDbConnection con = new OleDbConnection(connectionString); 
} 
0

私はあなたのコードでこれらの7つの事を修正提案:

  • コメントはなく、//と、\\で導入されていません。
  • connectionStringは、パラメータリストの末尾がConnectionStirngです。
  • connectionStringは、Tの代わりにstringである必要があります。
  • ADO.NET接続オブジェクトはIDisposableです。ブロックに入れてください。
  • 投稿したコードから判断すると、ジェネリック医薬品は一切必要ありません。
  • getDataではなく、GetDataという名前でメソッド名を大文字にすると、.NETのようになります。
  • メソッドGetDataを呼び出すと、合理的な人はデータを返すと予想します。戻り値のタイプはvoidではありません。

さらに騒ぎがなければ、これは動作するコードに近づけるようになります。

public TypeOfWhateverDataYouReturn GetData(string connectionString) 
{ 
    using (var con = new OleDbConnection(connectionString)) 
    { 
     // ... 
    } 
}