Freigeben über


Bicep-Diagnosecode – BCP318

Diese Diagnose tritt auf, wenn Sie versuchen, auf eine Eigenschaft für einen Wert zuzugreifen, der möglicherweise nicht der Fall ist null. Die Diagnose wird auch ausgelöst, wenn versucht wird, auf eine Eigenschaft für eine bedingte Ressource zuzugreifen (d. r. eine Ressource, die mit einer if Klausel in Bicep deklariert wurde). Verweise auf Ressourcen mit einer false Bedingung führen in der Regel dazu, dass die Bereitstellung mit einem Überprüfungsfehler fehlschlägt.

Description

Der Wert des Typs "<resource-type> | null" kann am Anfang der Bereitstellung null sein, was dazu führen würde, dass dieser Zugriffsausdruck (und die allgemeine Bereitstellung damit) fehlschlägt.

Ebene

Warnung

Solutions

Wenn der Wert möglicherweise null ist und Die Vorlage null für den gesamten Ausdruck sicher verarbeiten kann, verwenden Sie den Operator "safe-dereference". Diese Kurzschlussschaltung des Zugriffs, wenn der Basisausdruck null oder eine Ressource ist, deren Bedingung lautet false.

Wenn Sie sicher sind, dass der Wert niemals null ist, verwenden Sie den Operator null-verzeihend , um dem Compiler mitzuteilen, dass er sicher ist. Dadurch wird die Kompilierungszeitüberprüfung deaktiviert, die Laufzeitüberprüfung wird jedoch weiterhin ausgeführt.

Examples

Im folgenden Beispiel wird die Diagnose ausgelöst, da Bicep nicht garantieren kann, dass accounts[i] sie für jedes i vorhanden ist range(0, storageCount). Einige Indizes werden übersprungen, sodass die direkte Indizierung unsicher ist.

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]

Sie können die Diagnose mithilfe des Operators "safe-dereference" beheben:

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]

Im folgenden Beispiel wird die Diagnose ausgelöst, da die if Bedingung die Arraylänge zur Kompilierungszeit unbestimmt macht, sodass Bicep die direkte Indizierung wie 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

Sie können die Diagnose mithilfe des Null-Verzeihungsoperators beheben:

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

Nächste Schritte

Weitere Informationen zur Bicep-Diagnose finden Sie unter Bicep-Kerndiagnose.