Bicep 诊断代码 - BCP318

尝试访问可能或可能不是 null的值的属性时,会发生此诊断。 尝试访问条件资源上的属性(即在 Bicep 中使用子句声明 if 的资源)时,也会引发诊断。 对具有 false 条件的资源的引用通常会导致部署失败并出现验证错误。

Description

类型“<resource-type> | 的值在部署开始时,null“可能为 null,这将导致此访问表达式(及其整体部署)失败。

级别

警告

Solutions

如果该值可能为 null,并且模板可以安全地处理整个表达式的 null,请使用 safe-dereference 运算符。 如果基表达式为 null 或条件为 false资源,则这会使访问短路。

如果确定该值永远不会为 null,请使用 null 表示运算符 告知编译器它是安全的。 这将禁用编译时验证,但仍会执行运行时验证。

例子

下面的示例引发诊断,因为 Bicep 无法保证 accounts[i] 每个 irange(0, storageCount)都存在。 跳过某些索引,因此直接索引不安全。

param storageCount int

resource accounts 'Microsoft.Storage/storageAccounts@2015-01-01' = [for i in range(0, storageCount): if (i % 2 == 0) {
  name: 'sa${i}'
  location: resourceGroup().location
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
}]

output storageEndpoints array = [for i in range(0, storageCount): accounts[i].properties.primaryEndpoints.blob]

可以使用 safe-dereference 运算符修复诊断:

param storageCount int

resource accounts 'Microsoft.Storage/storageAccounts@2015-01-01' = [for i in range(0, storageCount): if (i % 2 == 0) {
  name: 'sa${i}'
  location: resourceGroup().location
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
}]

output storageEndpoints array = [for i in range(0, storageCount): accounts[i].?properties.primaryEndpoints.blob]

下面的示例引发诊断,因为if条件使数组长度在编译时不确定,因此 Bicep 无法安全地允许直接索引。accounts[0]

param storageCount int = 2

resource accounts 'Microsoft.Storage/storageAccounts@2015-01-01' = [for i in range(0, storageCount): if (i % 2 == 0) {
  name: 'sa${i}'
  location: resourceGroup().location
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
}]

output firstOne object = accounts[0].properties

可以使用 null 放弃运算符修复诊断:

param storageCount int = 2

resource accounts 'Microsoft.Storage/storageAccounts@2015-01-01' = [for i in range(0, storageCount): if (i % 2 == 0) {
  name: 'sa${i}'
  location: resourceGroup().location
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
}]

output firstOne object = accounts[0]!.properties

后续步骤

有关 Bicep 诊断的详细信息,请参阅 Bicep 核心诊断