【问题标题】:Error: 'T' must be a non-abstract type with a public parameterless constructor in order to use it as parameter 'T'错误:“T”必须是具有公共无参数构造函数的非抽象类型才能将其用作参数“T”
【发布时间】:2013-04-22 20:36:12
【问题描述】:

我正在尝试实现一个接受泛型 T 并返回 T 列表的方法。

    public static List<T> GetMessages<T>(string query, int count, SqlConnection sqlconnection)
        where T : ITable, new()
    {
        List<T> messages = new List<T>();
        List<T> errorMessages = new List<T>();

        DataSet response = DBUtils.ExecuteQueryScriptWithConnection(query, sqlconnection);

        for (int i = 0; i < response.Tables[0].Rows.Count; ++i)
        {
            T message = new T();

            DataRow row = response.Tables[0].Rows[i];
            message.Id = Convert.ToInt32(row[0]);
            message.CreatedDate = Convert.ToDateTime(row[1]);                
        }

        return messages;
    }

但是当我从另一个方法调用它时,我得到了错误:

“T”必须是具有公共无参数构造函数的非抽象类型,才能在泛型类型或方法“CIHelpers.TableHelpers.GetMessages&lt;T&gt;(string, int, System.Data.SqlClient.SqlConnection)”中用作参数“T”

我调用它的代码:

      List<T> messages = TableHelpers.GetMessages<T>(query, 1000, sqlconnection);

实现 ITable 的类(我传递的类型 T 在这里。

public class MessageReceived : ITable
{
    public int Id { get; set; }
    public DateTime CreatedDate { get; set; }

    string query = String.Format(@"select Id, CreatedDate, from MessageReceived where createddate > '2013-04-18 00:00:00.0000000'");

    public MessageReceived()
    {

    }
}

我做错了什么?

【问题讨论】:

    标签: c# generics


    【解决方案1】:

    调用代码中的T需要有相同的约束。

    否则,有人可能会使用没有构造函数的 T 调用您的包装函数。

    【讨论】:

    • @raleign 在这种情况下,你应该考虑accepting这个答案。
    • @svick,正如您在链接中所解释的那样,提问者仍然需要等待 6 分钟才能接受答案。请考虑让他放松一下。
    猜你喜欢
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多