尝试访问可能或可能不是 null
的值的属性时,会发生此诊断。 尝试访问条件资源上的属性(即在 Bicep 中使用子句声明 if
的资源)时,也会引发诊断。 对具有 false
条件的资源的引用通常会导致部署失败并出现验证错误。
Description
类型“<resource-type> | 的值在部署开始时,null“可能为 null,这将导致此访问表达式(及其整体部署)失败。
级别
警告
Solutions
如果该值可能为 null,并且模板可以安全地处理整个表达式的 null,请使用 safe-dereference 运算符。 如果基表达式为 null 或条件为 false
资源,则这会使访问短路。
如果确定该值永远不会为 null,请使用 null 表示运算符 告知编译器它是安全的。 这将禁用编译时验证,但仍会执行运行时验证。
例子
下面的示例引发诊断,因为 Bicep 无法保证 accounts[i]
每个 i
项 range(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 核心诊断。