gpt4 book ai didi

c#-4.0 - 使用 Azure 存储客户端库 3.0 方法executequery 编译错误,其中 T 是表实体

转载 作者:行者123 更新时间:2023-12-02 19:20:22 24 4
gpt4 key购买 nike

我一定错过了一些明显的东西,但以下失败并出现编译错误:

internal static IEnumerable<T> GetEntitiesWithCommaSeparatedRowKeys<T>(
string tableName, string partitionKey,
string commaDelimitedStringOfRowKeys) where T: TableEntity
{
....
TableQuery<T> entitiesQuery = new TableQuery<T>().Where(
TableQuery.CombineFilters(
TableQuery.GenerateFilterCondition("PartitionKey",
QueryComparisons.Equal, partitionKey),
TableOperators.And,
AzureHelper.GetFilterConditionForCommaDelimitedStringOfRowKeys(commaDelimitedStringOfRowKeys)
));
// compile error on this line
IEnumerable<T> entities = table.ExecuteQuery<T>(entitiesQuery);
...
}

我得到的错误是:

'T' must be a non-abstract type with a public parameterless constructor 
in order to use it as parameter 'TElement' in the generic type or
method 'Microsoft.WindowsAzure.Storage.Table.CloudTable.ExecuteQuery<TElement>
(Microsoft.WindowsAzure.Storage.Table.TableQuery<TElement>,
Microsoft.WindowsAzure.Storage.Table.TableRequestOptions,
Microsoft.WindowsAzure.Storage.OperationContext)'

TableEntity 显然有一个公共(public)无参数构造函数并且是非抽象的。以下是我在 TableEntity 上按 F12 时来自元数据信息的对象(只是为了确保其正确解析 TableEntity 类型)。

namespace Microsoft.WindowsAzure.Storage.Table
{

public class TableEntity : ITableEntity
{
// Summary:
// Initializes a new instance of the Microsoft.WindowsAzure.Storage.Table.TableEntity
// class.
public TableEntity();
...
}
}

有人有什么想法吗?仅供引用,我正在使用 Azure 客户端库 3.0.1.0。

更新:已添加linked issue解决了类似的问题

最佳答案

事实证明,如果一个方法提供了类型约束,则该约束也必须由该类型的任何调用者转发。

我不知道。

在本例中,Table.ExecuteQuery 的定义如下所示

 public IEnumerable<TElement> ExecuteQuery<TElement>(TableQuery<TElement> query,
TableRequestOptions requestOptions = null,
OperationContext operationContext = null)
where TElement : ITableEntity, new();

因此,将 new() 添加到 T 的约束中可以解决该问题。

所以最终的方法声明看起来像

internal static IEnumerable<T> GetEntitiesWithCommaSeparatedRowKeys<T>(string tableName,
string partitionKey,
string commaDelimitedStringOfRowKeys)
where T : TableEntity , new() //This is new (pun intended :))

related links 之一中发现相关问题出现了这个问题。

我猜测编译器总是可以在我实际进行调用时查找类型约束,但由于 TableEntity 是公共(public)的(并且不是密封的),我猜它最终可能会成为运行时问题。

还值得注意的是,我的方法被标记为内部,这应该真正使编译器能够检查库内的调用者。

无论如何,学到了一些新东西:)。

关于c#-4.0 - 使用 Azure 存储客户端库 3.0 方法executequery<T> 编译错误,其中 T 是表实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21052771/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com