我使用的是Azure.data.tables nuget包的12.0.0-beta.6。当我尝试调用TableClient.GetQueryAsync时,它会给出错误:
“类型”T“必须是引用类型,才能将其用作泛型类型或方法”TableClient.GetEntityAsync(string,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.QueryAsync(string,int?,IEnumerable,CancellationToken)”中的参数“T”
类型“T”不能用作泛型类型或方法“TableClient.QueryAsync(string,int?,IEnumerable,CancellationToken)”中的类型参数“T”。没有从“T”到“Azure.Data.Tables.ITableEntity”的隐式引用转换。
让我们看看该方法的文档:
public virtual Azure.Asyncpageable QueryAsync(string filter=default,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()