Generic中的错误

时间:2011-01-21 20:15:20

标签: c# generics

为什么以下代码不起作用?

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

4 个答案:

答案 0 :(得分:7)

因为connectionString应该是字符串,而不是T

OleDbConnection类只有两个构造函数:

OleDbConnection() // Empty parameter list

OleDbConnection(string connectionString) // takes a connection string

当你通过尝试传入类型为T的对象进行编译时,编译器无法知道它是什么类型(因为它在那时没有在上下文中使用)。

因此,由于T不能保证是一个字符串... OleDbConnection没有与您调用它的参数相匹配的重载。

在这种情况下,由于没有返回值,而connectionString必须是string类型...根本不需要泛型。它可以简单地写成:

public void getData(string connectionString)

除非您尝试返回T类型数据的集合,否则它将如下所示:

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

修改

...并且这些都没有说明您的参数名称与您尝试传递给构造函数的内容不匹配,或者您的注释中的斜杠是向后的事实。

答案 1 :(得分:3)

因为 OleDbConnection 需要一个字符串而你已经传递了一个T.

查看代码,您实际上并不需要泛型。当然这已经足够了:

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

答案 2 :(得分:0)

因为OleDbConnection的构造函数只接受一个字符串。

答案 3 :(得分:0)

我建议你在代码中解决这七件事:

  • 评论不会与\\一起引入,而是与//;
  • 一起引入 参数列表中的
  • connectionString拼写错误为ConnectionStirng;
  • connectionString应该是string而不是T;
  • ADO.NET连接对象为IDisposable;所以把它们放在using区块里。
  • 根据您发布的代码判断,此处根本不需要泛型。
  • 将方法的名称大写为GetData而不是getData更像.NET。
  • 如果您调用方法GetData,任何合理的人都会希望它返回数据。因此返回类型void没有意义。

不用多说,这应该更接近工作代码:

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