Pulumi C#报错CS0029:无法隐式转换ResourceGroup为Output<ResourceGroup>
问题场景
使用C#结合Pulumi Azure Native开发基础设施即代码时,编写GenerateResourceGroup类封装资源组创建逻辑:类中声明了带[Output]特性的Output<ResourceGroup>类型属性resourceGroup,在构造函数里初始化完Pulumi.AzureNative.Resources.ResourceGroup实例rg后,直接将rg赋值给resourceGroup属性时触发CS0029编译错误。
具体错误信息:
Cannot implicitly convert type Pulumi.AzureNative.Resources.ResourceGroup to Pulumi.Output<Pulumi.AzureNative.Resources.ResourceGroup>

触发错误的复现代码:
public GenerateResourceGroup(Input<string> location, string rgName, Dictionary<string, string> tags) { var config = new Pulumi.Config(); var rg = new Pulumi.AzureNative.Resources.ResourceGroup(rgName, new Pulumi.AzureNative.Resources.ResourceGroupArgs { Location = location, ResourceGroupName = rgName, Tags = tags, }); //resourceGroupName = resourceGroup.Name.Apply(t => $"{t}"); // 下一行触发CS0029错误 resourceGroup = rg; } //[Output] //public Output<ResourceGroup> resourceGroupName { get; } [Output] public Output<ResourceGroup> resourceGroup { get; }
错误原因
- Pulumi里
Output<T>是专门用来封装部署完成后才能确定的异步值的类型,资源实例本身的类型就是对应的资源类(比如这里的ResourceGroup),不属于Output<T>的泛型实例,二者不存在隐式转换关系,直接赋值必然报类型不匹配错误。 - 另外
[Output]特性仅用来标记需要作为栈输出的Output<T>类型属性,不能用来标记实体资源类型的属性。
修复方案
根据实际需求二选一即可:
- 如果需要对外暴露整个资源组实例供其他资源依赖引用:直接把属性类型改成
ResourceGroup,去掉[Output]特性,直接赋值即可。 - 如果需要把资源组的相关值作为栈输出暴露:不要输出整个资源对象,改为输出资源的具体属性(资源实例的Name、Id等属性本身就是
Output<T>类型,可以直接赋值给带[Output]标记的同类型属性)。
修正后的参考代码:
public GenerateResourceGroup(Input<string> location, string rgName, Dictionary<string, string> tags) { var config = new Pulumi.Config(); var rg = new Pulumi.AzureNative.Resources.ResourceGroup(rgName, new Pulumi.AzureNative.Resources.ResourceGroupArgs { Location = location, ResourceGroupName = rgName, Tags = tags, }); // 给普通资源属性赋值,供其他资源引用 RgInstance = rg; // 给Output属性赋值,作为栈输出 RgName = rg.Name; } // 供内部资源依赖引用的资源实例属性,不加[Output] public ResourceGroup RgInstance { get; } // 作为栈输出的资源名称属性,加[Output] [Output] public Output<string> RgName { get; }
内容的提问来源于stack exchange,提问作者Ashwani Kumar
相关产品推荐
相关产品推荐

