Null-waarschuwingen oplossen

In dit artikel worden de volgende compilerwaarschuwingen behandeld:

  • Cs8597 - Gegenereerde waarde kan null zijn.
  • CS8600 - Null-letterlijke waarde of mogelijke null-waarde converteren naar een niet-null-type.
  • CS8601 - Mogelijke null-verwijzingstoewijzing.
  • CS8602 - Dereference van een mogelijk null-verwijzing.
  • CS8603 - Mogelijke null-verwijzings geretourneerd.
  • CS8604 - Mogelijk null-verwijzingsargument voor parameter.
  • CS8605 - Het postvak UIT van een mogelijk null-waarde opheffen.
  • CS8607 - Een mogelijke null-waarde kan niet worden gebruikt voor een type dat is gemarkeerd met [NotNull] of [DisallowNull]
  • Cs8608 - Nullability of reference types in type komt niet overeen met overschreven lid.
  • Cs8609 - Nullability of reference types in return type komt niet overeen met overschreven lid.
  • CS8610 - Nullability of reference types in type parameter komt niet overeen met overschreven lid.
  • CS8611 - Nullability of reference types in type parameter komt niet overeen met gedeeltelijke methodedeclaratie.
  • Cs8612 - Nullability of reference types in type komt niet overeen met impliciet geïmplementeerd lid.
  • Cs8613 - Nullability of reference types in return type komt niet overeen met impliciet geïmplementeerd lid.
  • CS8614 - Nullability of reference types in type parameter komt niet overeen met impliciet geïmplementeerd lid.
  • Cs8615 - Nullability of reference types in type komt niet overeen met geïmplementeerd lid.
  • CS8616 - Nullability of reference types in return type komt niet overeen met geïmplementeerd lid.
  • CS8617 - Nullability of reference types in type parameter komt niet overeen met geïmplementeerd lid.
  • CS8618 - Niet-null-variabele moet een niet-null-waarde bevatten bij het afsluiten van de constructor. Overweeg deze te declareren als nullable.
  • Cs8619 - Nullability of reference types in value komt niet overeen met het doeltype.
  • CS8620 - Argument kan niet worden gebruikt voor de parameter vanwege verschillen in de null-waarde van verwijzingstypen.
  • CS8621 - Nullability of reference types in return type komt niet overeen met de doeldelegatie (mogelijk vanwege nullability attributes).
  • CS8622 - Nullability of reference types in type parameter komt niet overeen met de doeldelegatie (mogelijk vanwege nullability attributes).
  • CS8624 - Argument kan niet worden gebruikt als uitvoer vanwege verschillen in de null-baarheid van verwijzingstypen.
  • CS8625 - Kan null-letterlijke waarde niet converteren naar niet-null-verwijzingstype.
  • Cs8629 - Nullable value type kan null zijn.
  • CS8631 - Het type kan niet worden gebruikt als typeparameter in het algemene type of de methode. Null-waarde van het typeargument komt niet overeen met het beperkingstype.
  • Cs8633 - Nullability in beperkingen voor de typeparameter van de methode komt niet overeen met de beperkingen voor de typeparameter van de interfacemethode. Overweeg in plaats daarvan een expliciete interface-implementatie te gebruiken.
  • CS8634 - Het type kan niet worden gebruikt als typeparameter in het algemene type of de methode. Null-waarde van het typeargument komt niet overeen met de beperking 'klasse'.
  • CS8643 - Nullability van verwijzingstypen in expliciete interfaceaanduiding komt niet overeen met de interface die door het type is geïmplementeerd.
  • Cs8644 - Type implementeert geen interfacelid. De null-waarde van referentietypen in de interface die door het basistype is geïmplementeerd, komt niet overeen.
  • CS8645 - Lid wordt al vermeld in de interfacelijst op type met verschillende null-waarde van referentietypen.
  • CS8655 - De switchexpressie verwerkt geen null-invoer (dit is niet volledig).
  • Declaraties van gedeeltelijke methoden van CS8667 - hebben inconsistente null-waarde in beperkingen voor de typeparameter.
  • Initialisatiefunctie voor CS8670-objecten - of verzamelingen deducties mogelijk null-lid.
  • CS8714 - Het type kan niet worden gebruikt als typeparameter in het algemene type of de methode. De null-waarde van het typeargument komt niet overeen met de beperking 'notnull'.
  • De parameter CS8762 - moet een niet-null-waarde hebben bij het afsluiten.
  • CS8763 - Een methode die is gemarkeerd[DoesNotReturn], mag niet worden geretourneerd.
  • CS8764 - Nullability of return type komt niet overeen met overschreven lid (mogelijk vanwege nullability attributes).
  • CS8765 - Nullability van het type parameter komt niet overeen met het overschreven lid (mogelijk vanwege nullability-kenmerken).
  • CS8766 - Nullability of reference types in return type of komt niet overeen met impliciet geïmplementeerd lid (mogelijk vanwege nullability attributes).
  • CS8767 - Nullability of reference types in type parameter of komt niet overeen met impliciet geïmplementeerd lid (mogelijk vanwege nullability attributes).
  • CS8768 - Nullability of reference types in return type komt niet overeen met geïmplementeerd lid (mogelijk vanwege nullability attributes).
  • CS8769 - Nullability of reference types in type parameter komt niet overeen met geïmplementeerd lid (mogelijk vanwege nullability attributes).
  • Cs8770-methode - ontbreekt [DoesNotReturn] aan aantekeningen om het geïmplementeerde of overschreven lid te vinden.
  • Cs8774-lid - moet een niet-null-waarde hebben bij het afsluiten.
  • Cs8776 - Lid kan niet worden gebruikt in dit kenmerk.
  • Cs8775-lid - moet een niet-null-waarde hebben bij het afsluiten.
  • De parameter CS8777 - moet een niet-null-waarde hebben bij het afsluiten.
  • Cs8819 - Nullability of reference types in return type komt niet overeen met gedeeltelijke methodedeclaratie.
  • De parameter CS8824 - moet een niet-null-waarde hebben bij het afsluiten omdat de parameter niet null is.
  • De retourwaarde cs8825 - moet niet-null zijn omdat de parameter niet null is.
  • CS8847 - De switchexpressie verwerkt geen enkele null-invoer (dit is niet volledig). Een patroon met een 'when'-component kan echter overeenkomen met deze waarde.

Het doel van null-bare waarschuwingen is om de kans te minimaliseren dat uw toepassing een System.NullReferenceException uitvoering genereert. Om dit doel te bereiken, gebruikt de compiler statische analyse en waarschuwingen voor problemen wanneer uw code constructies heeft die kunnen leiden tot null-referentie-uitzonderingen. U geeft de compiler informatie over de statische analyse door typeaantekeningen en -kenmerken toe te passen. Deze aantekeningen en kenmerken beschrijven de null-waarde van argumenten, parameters en leden van uw typen. In dit artikel leert u verschillende technieken voor het oplossen van de null-bare waarschuwingen die de compiler genereert op basis van de statische analyse. De technieken die hier worden beschreven, zijn voor algemene C#-code. Leer hoe u kunt werken met null-referentietypen en Entity Framework-kern in Werken met null-referentietypen.

U gaat bijna alle waarschuwingen aanpakken met behulp van een van de vier technieken:

  • Vereiste null-controles toevoegen.
  • Aantekeningen toevoegen ? of ! nullen.
  • Kenmerken toevoegen die null-semantiek beschrijven.
  • Variabelen correct initialiseren.

Mogelijke deductie van null

Deze set waarschuwingen geeft aan dat u een variabele waarvan de null-status misschien null is, uitstellen. Deze waarschuwingen zijn:

  • CS8602 - Dereference van een mogelijk null-verwijzing.
  • Initialisatiefunctie voor CS8670-objecten - of verzamelingen deducties mogelijk null-lid.

In de volgende code ziet u een voorbeeld van elk van de voorgaande waarschuwingen:

class Container
{
    public List<string>? States { get; set; }
}

internal void PossibleDereferenceNullExamples(string? message)
{
    Console.WriteLine(message.Length); // CS8602

    var c = new Container { States = { "Red", "Yellow", "Green" } }; // CS8670
}

In het bovenstaande voorbeeld is de waarschuwing omdat de Container, cmogelijk een null-waarde voor de States eigenschap heeft. Als u nieuwe statussen toewijst aan een verzameling die mogelijk null is, wordt de waarschuwing veroorzaakt.

Als u deze waarschuwingen wilt verwijderen, moet u code toevoegen om de null-status van die variabele te wijzigen in not-null voordat u deze deductie ongedaan maakt. De initialisatiewaarschuwing van de verzameling kan moeilijker te herkennen zijn. De compiler detecteert dat de verzameling misschien null is wanneer de initialisatiefunctie er elementen aan toevoegt.

In veel gevallen kunt u deze waarschuwingen oplossen door te controleren of een variabele niet null is voordat deze wordt uitgesteld. Houd rekening met het volgende waarmee een null-controle wordt toegevoegd voordat de message parameter wordt uitgesteld:

void WriteMessageLength(string? message)
{
    if (message is not null)
    {
        Console.WriteLine(message.Length);
    }
    
}

In het volgende voorbeeld wordt de back-upopslag voor de States back-up geïnitialiseerd en wordt de set toegangsfunctie verwijderd. Consumenten van de klasse kunnen de inhoud van de verzameling wijzigen en de opslag voor de verzameling is nooit null:

class Container
{
    public List<string> States { get; } = new();
}

Andere exemplaren wanneer u deze waarschuwingen krijgt, zijn mogelijk fout-positief. Mogelijk hebt u een persoonlijke hulpprogrammamethode waarmee null wordt getest. De compiler weet niet dat de methode een null-controle biedt. Bekijk het volgende voorbeeld waarin gebruik wordt gemaakt van een methode voor privéhulpprogramma's: IsNotNull

public void WriteMessage(string? message)
{
    if (IsNotNull(message))
        Console.WriteLine(message.Length);
}

De compiler waarschuwt dat u null mogelijk uitstellen wanneer u de eigenschap message.Length schrijft, omdat de statische analyse bepaalt dat dit message mogelijk is null. U weet misschien dat IsNotNull dit een null-controle biedt en wanneer deze wordt geretourneerdtrue, moet de null-statusmessage niet-null zijn. U moet de compiler die feiten vertellen. Een manier is om de operator null forgiving te gebruiken. ! U kunt de instructie wijzigen zodat deze WriteLine overeenkomt met de volgende code:

Console.WriteLine(message!.Length);

Met de operator null-vergeefs wordt de expressie niet null, zelfs niet als deze mogelijk null was zonder de toegepaste waarde!. In dit voorbeeld is een betere oplossing om een kenmerk toe te voegen aan de handtekening van IsNotNull:

private static bool IsNotNull([NotNullWhen(true)] object? obj) => obj != null;

De System.Diagnostics.CodeAnalysis.NotNullWhenAttribute compiler informeert dat het argument dat wordt gebruikt voor de obj parameter niet null is wanneer de methode wordt geretourneerdtrue. Wanneer de methode wordt geretourneerd false, heeft het argument dezelfde null-status die het had voordat de methode werd aangeroepen.

Tip

Er is een uitgebreide set kenmerken die u kunt gebruiken om te beschrijven hoe uw methoden en eigenschappen van invloed zijn op null-status. U vindt deze informatie in het naslagartikel over de taal over nullable statische analysekenmerken.

Het oplossen van een waarschuwing voor het uitstellen van een misschien-null-variabele omvat een van de volgende drie technieken:

  • Voeg een ontbrekende null-controle toe.
  • Voeg null-analysekenmerken toe aan API's om de statische analyse met null-status van de compiler te beïnvloeden. Deze kenmerken informeren de compiler wanneer een retourwaarde of argument mogelijk null of niet null moet zijn na het aanroepen van de methode.
  • Pas de operator ! null forgiving toe op de expressie om de status af te dwingen op not-null.

Mogelijke null die is toegewezen aan een niet-toe te wijzen verwijzing

Deze set waarschuwingen waarschuwt u dat u een variabele toewijst waarvan het type niet kan worden opgenomen in een expressie waarvan de null-status misschien null is. Deze waarschuwingen zijn:

  • Cs8597 - Gegenereerde waarde kan null zijn.
  • CS8600 - Null-letterlijke waarde of mogelijke null-waarde converteren naar een niet-null-type.
  • CS8601 - Mogelijke null-verwijzingstoewijzing.
  • CS8603 - Mogelijke null-verwijzings geretourneerd.
  • CS8604 - Mogelijk null-verwijzingsargument voor parameter.
  • CS8605 - Het postvak UIT van een mogelijk null-waarde opheffen.
  • CS8625 - Kan null-letterlijke waarde niet converteren naar niet-null-verwijzingstype.
  • Cs8629 - Nullable value type kan null zijn.

De compiler verzendt deze waarschuwingen wanneer u probeert een expressie toe te wijzen die mogelijk null is aan een variabele die niet kan worden ingetrokken. Voorbeeld:

string? TryGetMessage(int id) => "";

string msg = TryGetMessage(42);  // Possible null assignment.

De verschillende waarschuwingen geven details op over de code, zoals toewijzing, toewijzing opheffen, retourinstructies, argumenten voor methoden en expressies genereren.

U kunt een van de drie acties uitvoeren om deze waarschuwingen aan te pakken. Een is het toevoegen van de ? aantekening om de variabele een nullable verwijzingstype te maken. Deze wijziging kan andere waarschuwingen veroorzaken. Als u een variabele wijzigt van een niet-null-verwijzing naar een verwijzing die null kan worden gebruikt, wordt de standaard null-status gewijzigd van not-null in misschien-null. De statische analyse van de compiler kan exemplaren vinden waarbij u een variabele deducteert die mogelijk null is.

Met de andere acties wordt de compiler geïnstrueerd dat de rechterzijde van de toewijzing niet null is. De expressie aan de rechterkant kan null-gecontroleerd worden vóór de toewijzing, zoals wordt weergegeven in het volgende voorbeeld:

string notNullMsg = TryGetMessage(42) ?? "Unknown message id: 42";

In de vorige voorbeelden ziet u hoe de retourwaarde van een methode wordt toegewezen. U kunt aantekeningen toevoegen aan de methode (of eigenschap) om aan te geven wanneer een methode een niet-null-waarde retourneert. De System.Diagnostics.CodeAnalysis.NotNullIfNotNullAttribute vaak geeft aan dat een retourwaarde niet null is wanneer een invoerargument niet null is. Een ander alternatief is om de operator null forgiving toe te voegen aan ! de rechterkant:

string msg = TryGetMessage(42)!;

Het oplossen van een waarschuwing voor het toewijzen van een misschien-null-expressie aan een niet-null-variabele omvat een van de vier technieken:

  • Wijzig de linkerkant van de toewijzing in een null-type. Met deze actie kunnen nieuwe waarschuwingen worden geïntroduceerd wanneer u die variabele deductie uitvoert.
  • Geef een null-controle op vóór de toewijzing.
  • Aantekeningen toevoegen aan de API die de rechterkant van de toewijzing produceert.
  • Voeg de operator null forgiving toe aan de rechterkant van de toewijzing.

Niet-initiabele verwijzing niet geïnitialiseerd

Deze set waarschuwingen waarschuwt u dat u een variabele toewijst waarvan het type niet nullbaar is voor een expressie waarvan de null-status misschien null is. Deze waarschuwingen zijn:

  • CS8618 - Niet-null-variabele moet een niet-null-waarde bevatten bij het afsluiten van de constructor. Overweeg deze te declareren als nullable.
  • De parameter CS8762 - moet een niet-null-waarde hebben bij het afsluiten.

Bekijk de volgende klasse als voorbeeld:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

LastName Noch FirstName worden gegarandeerd geïnitialiseerd. Als deze code nieuw is, kunt u overwegen de openbare interface te wijzigen. Het bovenstaande voorbeeld kan als volgt worden bijgewerkt:

public class Person
{
    public Person(string first, string last)
    {
        FirstName = first;
        LastName = last;
    }

    public string FirstName { get; set; }
    public string LastName { get; set; }
}

Als u een Person object wilt maken voordat u de naam instelt, kunt u de eigenschappen initialiseren met een standaardwaarde die niet null is:

public class Person
{
    public string FirstName { get; set; } = string.Empty;
    public string LastName { get; set; } = string.Empty;
}

Een ander alternatief kan zijn om deze leden te wijzigen in null-verwijzingstypen. De Person klasse kan als volgt worden gedefinieerd als null deze moet worden toegestaan voor de naam:

public class Person
{
    public string? FirstName { get; set; }
    public string? LastName { get; set; }
}

Voor bestaande code kunnen andere wijzigingen nodig zijn om de compiler te informeren over de null-semantiek voor die leden. U hebt mogelijk meerdere constructors gemaakt en uw klasse heeft mogelijk een persoonlijke helpermethode waarmee een of meer leden worden geïnitialiseerd. U kunt de initialisatiecode verplaatsen naar één constructor en ervoor zorgen dat alle constructors de code aanroepen met de algemene initialisatiecode. U kunt ook de System.Diagnostics.CodeAnalysis.MemberNotNullAttribute kenmerken en System.Diagnostics.CodeAnalysis.MemberNotNullWhenAttribute kenmerken gebruiken. Deze kenmerken informeren de compiler dat een lid niet null is nadat de methode is aangeroepen. In de volgende code ziet u een voorbeeld van elk. De Person klasse maakt gebruik van een algemene constructor die wordt aangeroepen door alle andere constructors. De Student klasse heeft een helpermethode die is voorzien van een aantekening met het System.Diagnostics.CodeAnalysis.MemberNotNullAttribute kenmerk:


using System.Diagnostics.CodeAnalysis;

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public Person(string firstName, string lastName)
    {
        FirstName = firstName;
        LastName = lastName;
    }

    public Person() : this("John", "Doe") { }
}

public class Student : Person
{
    public string Major { get; set; }

    public Student(string firstName, string lastName, string major)
        : base(firstName, lastName)
    {
        SetMajor(major);
    }

    public Student(string firstName, string lastName) :
        base(firstName, lastName)
    {
        SetMajor();
    }

    public Student()
    {
        SetMajor();
    }

    [MemberNotNull(nameof(Major))]
    private void SetMajor(string? major = default)
    {
        Major = major ?? "Undeclared";
    }
}

Ten slotte kunt u de operator null forgiving gebruiken om aan te geven dat een lid is geïnitialiseerd in andere code. Bekijk voor een ander voorbeeld de volgende klassen die een Entity Framework Core-model vertegenwoordigen:

public class TodoItem
{
    public long Id { get; set; }
    public string? Name { get; set; }
    public bool IsComplete { get; set; }
}

public class TodoContext : DbContext
{
    public TodoContext(DbContextOptions<TodoContext> options)
        : base(options)
    {
    }

    public DbSet<TodoItem> TodoItems { get; set; } = null!;
}

De DbSet eigenschap wordt geïnitialiseerd naar null!. Hiermee wordt aan de compiler aangegeven dat de eigenschap is ingesteld op een niet-null-waarde . In feite voert de basis DbContext de initialisatie van de set uit. De statische analyse van de compiler haalt dat niet op. Zie het artikel over het werken met Nullable Reference Types in EF Core voor meer informatie over het werken met null-referentietypen en Entity Framework Core.

Het corrigeren van een waarschuwing voor het niet initialiseren van een niet-toe te passen lid omvat een van de vier technieken:

  • Wijzig de constructors of veld initialisaties om ervoor te zorgen dat alle niet-inullable leden worden geïnitialiseerd.
  • Wijzig een of meer leden in null-typen.
  • Aantekeningen toevoegen aan helpermethoden om aan te geven welke leden zijn toegewezen.
  • Voeg een initialisatiefunctie toe om aan te null! geven dat het lid is geïnitialiseerd in andere code.

Niet overeenkomen in declaratie voor null-baarheid

Veel waarschuwingen geven aan dat null-waarden niet overeenkomen tussen handtekeningen voor methoden, gemachtigden of typeparameters.

  • Cs8608 - Nullability of reference types in type komt niet overeen met overschreven lid.
  • Cs8609 - Nullability of reference types in return type komt niet overeen met overschreven lid.
  • CS8610 - Nullability of reference types in type parameter komt niet overeen met overschreven lid.
  • CS8611 - Nullability of reference types in type parameter komt niet overeen met gedeeltelijke methodedeclaratie.
  • Cs8612 - Nullability of reference types in type komt niet overeen met impliciet geïmplementeerd lid.
  • Cs8613 - Nullability of reference types in return type komt niet overeen met impliciet geïmplementeerd lid.
  • CS8614 - Nullability of reference types in type parameter komt niet overeen met impliciet geïmplementeerd lid.
  • Cs8615 - Nullability of reference types in type komt niet overeen met geïmplementeerd lid.
  • CS8616 - Nullability of reference types in return type komt niet overeen met geïmplementeerd lid.
  • CS8617 - Nullability of reference types in type parameter komt niet overeen met geïmplementeerd lid.
  • Cs8619 - Nullability of reference types in value komt niet overeen met het doeltype.
  • CS8620 - Argument kan niet worden gebruikt voor de parameter vanwege verschillen in de null-waarde van verwijzingstypen.
  • CS8621 - Nullability of reference types in return type komt niet overeen met de doeldelegatie (mogelijk vanwege nullability attributes).
  • CS8622 - Nullability of reference types in type parameter komt niet overeen met de doeldelegatie (mogelijk vanwege nullability attributes).
  • CS8624 - Argument kan niet worden gebruikt als uitvoer vanwege verschillen in de null-baarheid van verwijzingstypen.
  • CS8631 - Het type kan niet worden gebruikt als typeparameter in het algemene type of de methode. Null-waarde van het typeargument komt niet overeen met het beperkingstype.
  • Cs8633 - Nullability in beperkingen voor de typeparameter van de methode komt niet overeen met de beperkingen voor de typeparameter van de interfacemethode. Overweeg in plaats daarvan een expliciete interface-implementatie te gebruiken.
  • CS8634 - Het type kan niet worden gebruikt als typeparameter in het algemene type of de methode. Null-waarde van het typeargument komt niet overeen met de beperking 'klasse'.
  • CS8643 - Nullability van verwijzingstypen in expliciete interfaceaanduiding komt niet overeen met de interface die door het type is geïmplementeerd.
  • Cs8644 - Type implementeert geen interfacelid. De null-waarde van referentietypen in de interface die door het basistype is geïmplementeerd, komt niet overeen.
  • CS8645 - Lid wordt al vermeld in de interfacelijst op type met verschillende null-waarde van referentietypen.
  • Declaraties van gedeeltelijke methoden van CS8667 - hebben inconsistente null-waarde in beperkingen voor de typeparameter.
  • CS8714 - Het type kan niet worden gebruikt als typeparameter in het algemene type of de methode. De null-waarde van het typeargument komt niet overeen met de beperking 'notnull'.
  • CS8764 - Nullability of return type komt niet overeen met overschreven lid (mogelijk vanwege nullability attributes).
  • CS8765 - Nullability van het type parameter komt niet overeen met het overschreven lid (mogelijk vanwege nullability-kenmerken).
  • CS8766 - Nullability of reference types in return type of komt niet overeen met impliciet geïmplementeerd lid (mogelijk vanwege nullability attributes).
  • CS8767 - Nullability of reference types in type parameter of komt niet overeen met impliciet geïmplementeerd lid (mogelijk vanwege nullability attributes).
  • CS8768 - Nullability of reference types in return type komt niet overeen met geïmplementeerd lid (mogelijk vanwege nullability attributes).
  • CS8769 - Nullability of reference types in type parameter komt niet overeen met geïmplementeerd lid (mogelijk vanwege nullability attributes).
  • Cs8819 - Nullability of reference types in return type komt niet overeen met gedeeltelijke methodedeclaratie.

De volgende code demonstreert CS8764:

public class B
{
    public virtual string GetMessage(string id) => string.Empty;
}
public class D : B
{
    public override string? GetMessage(string? id) => default;
}

In het voorgaande voorbeeld ziet u een virtual methode in een basisklasse en een override met een andere null-waarde. De basisklasse retourneert een niet-null-tekenreeks, maar de afgeleide klasse retourneert een tekenreeks die null kan worden gebruikt. Als de string en string? worden omgekeerd, zou dit zijn toegestaan omdat de afgeleide klasse restrictiever is. Op dezelfde manier moeten parameterdeclaraties overeenkomen. Parameters in de onderdrukkingsmethode kunnen null toestaan, zelfs als de basisklasse dat niet doet.

Andere situaties kunnen deze waarschuwingen genereren. Mogelijk komt de declaratie van een interfacemethode niet overeen en de implementatie van die methode. Of een gemachtigdentype en de expressie voor die gemachtigde kunnen verschillen. Een typeparameter en het typeargument kunnen verschillen in null-waarde.

Werk de juiste declaratie bij om deze waarschuwingen op te lossen.

Code komt niet overeen met kenmerkdeclaratie

In de voorgaande secties is besproken hoe u kenmerken voor statische analyse kunt gebruiken om de compiler te informeren over de null-semantiek van uw code. De compiler waarschuwt u als de code niet voldoet aan de beloften van dat kenmerk:

  • CS8607 - Een mogelijke null-waarde kan niet worden gebruikt voor een type dat is gemarkeerd met [NotNull] of [DisallowNull]
  • CS8763 - Een methode die is gemarkeerd[DoesNotReturn], mag niet worden geretourneerd.
  • Cs8770-methode - ontbreekt [DoesNotReturn] aan aantekeningen om het geïmplementeerde of overschreven lid te vinden.
  • Cs8774-lid - moet een niet-null-waarde hebben bij het afsluiten.
  • Cs8775-lid - moet een niet-null-waarde hebben bij het afsluiten.
  • Cs8776 - Lid kan niet worden gebruikt in dit kenmerk.
  • De parameter CS8777 - moet een niet-null-waarde hebben bij het afsluiten.
  • De parameter CS8824 - moet een niet-null-waarde hebben bij het afsluiten omdat de parameter niet null is.
  • De retourwaarde cs8825 - moet niet-null zijn omdat de parameter niet null is.

Houd rekening met de volgende methode:

public bool TryGetMessage(int id, [NotNullWhen(true)] out string? message)
{
    message = null;
    return true;

}

De compiler produceert een waarschuwing omdat de message parameter is toegewezen nullen de methode retourneert true. Het NotNullWhen kenmerk geeft aan dat dit niet moet gebeuren.

Als u deze waarschuwingen wilt oplossen, werkt u uw code bij zodat deze overeenkomt met de verwachtingen van de kenmerken die u hebt toegepast. U kunt de kenmerken of het algoritme wijzigen.

Uitputtende switchexpressie

Schakelexpressies moeten volledig zijn, wat betekent dat alle invoerwaarden moeten worden verwerkt. Zelfs voor niet-null-referentietypen moet de null waarde worden opgegeven. De compiler geeft waarschuwingen wanneer de null-waarde niet wordt verwerkt:

  • CS8655 - De switchexpressie verwerkt geen null-invoer (dit is niet volledig).
  • CS8847 - De switchexpressie verwerkt geen enkele null-invoer (dit is niet volledig). Een patroon met een 'when'-component kan echter overeenkomen met deze waarde.

In de volgende voorbeeldcode ziet u deze voorwaarde:

int AsScale(string status) =>
    status switch
    {
        "Red" => 0,
        "Yellow" => 5,
        "Green" => 10,
        { } => -1
    };

De invoerexpressie is een string, geen string?. Deze waarschuwing wordt nog steeds gegenereerd door de compiler. Het { } patroon verwerkt alle niet-null-waarden, maar komt niet overeen null. Als u deze fouten wilt oplossen, kunt u een expliciet null geval toevoegen of het { } vervangen door het _ patroon (verwijderen). Het verwijderingspatroon komt overeen met null en eventuele andere waarden.