C# 类型“T”必须是引用类型,才能在泛型类型或方法“TableClient.QueryAsync
我正在使用Azure.Data.Tables nuget包的12.0.0-beta.6。当我尝试调用TableClient.GetQueryAsync时,会出现以下错误: 类型“T”必须是引用类型,才能将其用作泛型类型或方法“TableClient.GetEntityAsyncstring,string,IEnumerable,CancellationToken”中的参数“T” 我看不出我做错了什么。有人能就如何解决这个错误提供建议吗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
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()
如果您将类作为约束添加到接口之外,它应该可以解决问题。不幸的是,它没有解决问题。我将编辑该问题,以包括执行此操作时发生的情况。看起来您的方法是在实现接口的类上定义的,您还需要更新接口上的相应方法?这是事实,谢谢。我已经将类约束添加到接口的方法定义中。我将结果错误添加到问题中。现在您遇到的问题是,您的方法没有指定新的约束,正如我在回答中所解释的。你也需要补充一下。谢谢你,这很有帮助!阅读文档总是很好:-我想我现在有正确的接口声明了。我仍然有一个错误,这是我在对你之前的答案的评论中描述的。