なぜ次のコードが機能しないのですか?Genericでのエラー
public void getData<T>(T ConnectionStirng)
{
OleDbConnection con = new OleDbConnection(connectionString); \\compile error
}
なぜ次のコードが機能しないのですか?Genericでのエラー
public void getData<T>(T ConnectionStirng)
{
OleDbConnection con = new OleDbConnection(connectionString); \\compile error
}
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のデータのコレクションを返すようにしようとしている場合を除き、それは次のようになりますように、それは簡単に書き込むことができます。あなたのパラメータ名があなたがコンストラクタに渡そうとしているものと一致しないという事実、またはあなたのコメント内のスラッシュが後方にあるという事実に対処していません。
正しいコードは何ですか? – visual2020
@ visual2020、もしあなたが*この答えを読んだら、あなたは正しいコードを推測できるはずです。 – stakx
+1!これは実際に私を笑顔にしました。 :) –
OleDbConnectionオブジェクトは、文字列を期待して、あなたが実際にジェネリックを必要としないコードを見てみるとT.
を通過してきたので。確かにこれで十分です:
public void getData(string connectionString)
{
OleDbConnection con = new OleDbConnection(connectionString);
}
私はあなたのコードでこれらの7つの事を修正提案:
//
と、\\
で導入されていません。connectionString
は、パラメータリストの末尾がConnectionStirng
です。connectionString
は、T
の代わりにstring
である必要があります。IDisposable
です。ブロックに入れてください。getData
ではなく、GetData
という名前でメソッド名を大文字にすると、.NETのようになります。GetData
を呼び出すと、合理的な人はデータを返すと予想します。戻り値のタイプはvoid
ではありません。さらに騒ぎがなければ、これは動作するコードに近づけるようになります。
public TypeOfWhateverDataYouReturn GetData(string connectionString)
{
using (var con = new OleDbConnection(connectionString))
{
// ...
}
}
は、そのソースコードであるか、単にこれを入力したのですか? – BrokenGlass
また、コメントスラッシュは間違った方法です。編集前にこれを修正してから、おそらくそれがあなたが直面している問題の一部です。 :) – stakx
なぜここにジェネリック薬を使用していますか? –