为什么这在 Cosmos PatchItemAsync 中被解释为动态数组
Why is this interpreted as a dynamic array, in 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)
{
...
}
}
显示以下错误:
Argument 3: cannot convert from 'dynamic[]' to 'System.Collections.Generic.IReadOnlyList<Microsoft.Azure.Cosmos.PatchOperation>'
我的问题是,为什么它不能正确解释类型。 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
。
我有这个代码:
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)
{
...
}
}
显示以下错误:
Argument 3: cannot convert from 'dynamic[]' to 'System.Collections.Generic.IReadOnlyList<Microsoft.Azure.Cosmos.PatchOperation>'
我的问题是,为什么它不能正确解释类型。 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
。