为什么这在 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