C# 类型“T”必须是引用类型,才能在泛型类型或方法“TableClient.QueryAsync

C# 类型“T”必须是引用类型,才能在泛型类型或方法“TableClient.QueryAsync,c#,generics,azure-table-storage,C#,Generics,Azure Table Storage,我正在使用Azure.Data.Tables nuget包的12.0.0-beta.6。当我尝试调用TableClient.GetQueryAsync时,会出现以下错误: 类型“T”必须是引用类型,才能将其用作泛型类型或方法“TableClient.GetEntityAsyncstring,string,IEnumerable,CancellationToken”中的参数“T” 我看不出我做错了什么。有人能就如何解决这个错误提供建议吗 public async Task<IList&l

我正在使用Azure.Data.Tables nuget包的12.0.0-beta.6。当我尝试调用TableClient.GetQueryAsync时,会出现以下错误:

类型“T”必须是引用类型,才能将其用作泛型类型或方法“TableClient.GetEntityAsyncstring,string,IEnumerable,CancellationToken”中的参数“T”

我看不出我做错了什么。有人能就如何解决这个错误提供建议吗

  public async Task<IList<T>> QueryAsync<T>(string queryText, CancellationToken cancellationToken) where T : ITableStorageEntity
        {            
            TableClient tableClient = new TableServiceClient("MY_CONNECTION_STRING").GetTableClient("MY_TABLE_NAME");

            var queryResult = await tableClient.QueryAsync<T>(filter: queryText, cancellationToken: cancellationToken);
         
            // prepare and return result list
        }
如果我向声明中添加一个类约束,如下所示:

  public async Task<IList<T>> QueryAsync<T>(string queryText, CancellationToken cancellationToken) where T : ITableStorageEntity
那么这些就是错误:

“T”必须是具有公共无参数构造函数的非抽象类型,才能将其用作泛型类型或方法“TableClient.QueryAsyncstring,int?,IEnumerable,CancellationToken”中的参数“T”

类型“T”不能用作泛型类型或方法“TableClient.QueryAsyncstring,int?,IEnumerable,CancellationToken”中的类型参数“T”。没有从“T”到“Azure.Data.Tables.ITableEntity”的隐式引用转换。

让我们看看:

公共虚拟Azure.AsyncPageable QueryAsync字符串筛选器=默认值,int?maxPerPage=default,System.Collections.Generic.IEnumerable select=default,System.Threading.CancellationToken CancellationToken=default,其中T:class,Azure.Data.Tables.ITableEntity,new

请参见泛型类型约束:

其中T:class,Azure.Data.Tables.ITableEntity,new

这意味着传入的任何T都必须是类,必须实现ITableEntity,并且必须具有无参数构造函数

但是,您的方法不强制执行此操作。您只需要T实现ITableStorageEntity。理论上,您的方法可以接受实现ITableStorageEntity但不是类或没有无参数构造函数的东西,并将其传递给Azure的QueryAsync,然后呢?你违反了规则

您的方法需要具有与QueryAsync相同的泛型类型约束,或者更严格:

public async Task<IList<T>> QueryAsync<T>(string queryText, CancellationToken cancellationToken)
    where T : class, ITableStorageEntity, new()

如果您将类作为约束添加到接口之外,它应该可以解决问题。不幸的是,它没有解决问题。我将编辑该问题,以包括执行此操作时发生的情况。看起来您的方法是在实现接口的类上定义的,您还需要更新接口上的相应方法?这是事实,谢谢。我已经将类约束添加到接口的方法定义中。我将结果错误添加到问题中。现在您遇到的问题是,您的方法没有指定新的约束,正如我在回答中所解释的。你也需要补充一下。谢谢你,这很有帮助!阅读文档总是很好:-我想我现在有正确的接口声明了。我仍然有一个错误,这是我在对你之前的答案的评论中描述的。