提问者:小点点

类型“T”必须是引用类型,才能将其用作泛型类型或方法“TableClient.QueryAsync<T>[duplicate]”中的参数“T”


我使用的是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”的隐式引用转换。


共1个答案

匿名用户

让我们看看该方法的文档:

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()