Sdílet prostřednictvím


Diagnostický kód Bicep – BCP318

K této diagnostice dochází při pokusu o přístup k vlastnosti u hodnoty, která může nebo nemusí být null. Diagnostika bude vyvolána také při pokusu o přístup k vlastnosti u podmíněného prostředku (to znamená prostředku deklarovaného pomocí if klauzule v Bicep). Odkazy na prostředky s podmínkou false obvykle způsobí selhání nasazení s chybou ověření.

Description

Hodnota typu< "typ> prostředku | Null může být null na začátku nasazení, což by způsobilo selhání tohoto přístupového výrazu (a celkového nasazení s ním).

Úroveň

Výstraha

Solutions

Pokud může být hodnota null a vaše šablona může bezpečně zpracovat hodnotu null pro celý výraz, použijte operátor safe-dereference. Tento zkratový okruh přístup v případě, že základní výraz má hodnotu null nebo prostředek, jehož podmínkou je false.

Pokud jste si jisti, že hodnota nebude nikdy null, použijte operátor null-forgiving k tomu, aby kompilátoru řekl, že je bezpečný. Tím se zakáže ověřování v době kompilace, ale ověření za běhu se bude provádět i nadále.

Examples

Následující příklad vyvolá diagnostiku, protože Bicep nemůže zaručit, že accounts[i] existuje pro každý i in range(0, storageCount). Některé indexy se přeskočí, takže přímé indexování je nebezpečné.

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]

Diagnostiku můžete opravit pomocí operátoru 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]

Následující příklad vyvolá diagnostiku, protože if podmínka znepřístupňuje délku pole v době kompilace, takže Bicep nemůže bezpečně povolit přímé indexování, jako je 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

Diagnostiku můžete opravit pomocí operátoru null-forgiving:

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

Další kroky

Další informace o diagnostice Bicep najdete v tématu Diagnostika jádra Bicep.