我有这样的代码:
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
。