当前位置: 首页 > 知识库问答 >
问题:

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

袁晟
2023-03-14

我使用的是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个答案

东方建修
2023-03-14

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

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()
 类似资料:
  • 我正在使用 我得到以下错误 错误CS0453类型“MyObject”必须是不可为空的值类型,才能将其用作泛型类型或方法“Nullable”中的参数“T” 我也试过 如果我将其设置为可为null,那么为什么我会在方法名称下面得到带有此错误消息的红线 stackoverflow的答案很简单,将返回类型设为null,但对我来说Visual studio不允许这样做。

  • 下面包含的代码抛出以下错误: 在这一行: 为什么Python不能在方法中识别我的类?

  • 我想使用泛型类作为另一个泛型类的类型参数。 起初,我对类的定义是这样的: 然后我的需求发生了变化,我不得不为我的R类型使用包装器/持有者类 到目前为止,我的尝试:(给出编译时错误:

  • 问题内容: 问题摘要: 我想将具有类型参数(例如)的类作为类型参数传递给泛型方法。 假设我有一个方法: 当然,此方法对于任何类型的类都可以正常使用。我可以这样调用该方法,例如: 问题: 我发现我不能这样做: 从句法上讲,这显然是无效的。但是,我不确定如何实现这样的目标。我当然可以通过,但是泛型类型的添加使其在语法上不再有效,并且我想不出解决方法。 唯一的直接解决方案是这样的事情(看起来很愚蠢):

  • 我有一个有界泛型类,我们称之为泛型,它的参数T扩展了抽象类abstract: 泛型类: 抽象类 泛型类中T引用的类 当尝试引用方法 getMap() 时,该方法来自 T 边界内的类(并且根据抽象类定义,T 的所有可能实例都将具有该方法),我收到以下错误: 不能从静态上下文引用非静态方法getMap() 然而,任何地方都没有静态关键字。我错过了什么?? 谢谢!

  • 我在我的一个实用程序类中有一个方法,它接受一个集合和一个类对象,并返回一个Iterable实例,该实例可以遍历作为指定类实例的集合的所有成员。其签名为: 这对于大多数用例都非常有效,但现在我需要将其与泛型类