为什么这被解释为一个动态数组,在Cosmos PatchItemAsync



我有这样的代码:

public async Task Patch(Guid id, string patchPath, dynamic itemValue, PK pk)
{
try
{
await this._cosmosContainer.PatchItemAsync<T>(
id: id.ToString(),
partitionKey: new PartitionKey(pk.ToString()),
patchOperations: new[] {
PatchOperation.Replace<dynamic>(patchPath, itemValue)
});
}
catch (CosmosException ex)
{
...
}
}

显示以下错误:

参数3:不能从'dynamic[]'转换为'System.Collections.Generic.IReadOnlyList'

我的问题是,为什么它不能正确地解释类型。patchOperations接收的类型为IReadOnlyList<PatchOperation>。所以如果我把数组类型改成new PatchOperation[]它就不再显示错误了

public async Task Patch(Guid id, string patchPath, dynamic itemValue, PK pk)
{
try
{
await this._cosmosContainer.PatchItemAsync<T>(
id: id.ToString(),
partitionKey: new PartitionKey(pk.ToString()),
patchOperations: new PatchOperation[] {
PatchOperation.Replace<dynamic>(patchPath, itemValue)
});
}
catch (CosmosException ex)
{
...
}
}

调用泛型方法.Replace<dynamic>()导致结果也是类型dynamic,并且由于您将其放入隐式类型数组中,因此它最终成为dynamic[]。通过将显式类型添加到new操作符,离开动态世界并返回到显式类型(如果运行时强制转换成功)。

所以dynamic在这一点上的行为与async/await相似。一旦你进入了它的世界,你必须一直使用它或者明确地离开它。

更新只是为了显示,一旦你输入dynamic所有内容都是dynamic看一下这个例子:

public class Program
{
public static void Main()
{
dynamic value = new object();
var result = DoSomething(value);
}
private static MyResult DoSomething<T>(T value)
{
return new MyResult();
}
}
public class MyResult
{
}

如果你在上面的例子中检查var result的类型,你会看到它是dynamic

最新更新