Megosztás a következőn keresztül:


Null értékű figyelmeztetések feloldása

Ez a cikk az alábbi fordítói figyelmeztetéseket ismerteti:

  • A CS8597 - Kidobott érték null értékű lehet.
  • CS8600 - Null literál vagy lehetséges null érték konvertálása nem null értékű típusra.
  • CS8601 - Lehetséges nullhivatkozás-hozzárendelés.
  • CS8602 - Lehetséges nullhivatkozás elhalasztása.
  • CS8603 - Lehetséges nullhivatkozási visszatérés.
  • CS8604 - Paraméter lehetséges nullhivatkozási argumentuma.
  • CS8605 - Lehetséges null érték kicsomagolása.
  • CS8607 - Lehetséges null érték nem használható olyan típushoz, amely [NotNull][DisallowNull]
  • A típusban lévő referenciatípusok CS8608 - nullíthatósága nem egyezik a felülírt tagokkal.
  • A cs8609 - hivatkozástípusok érvénytelensége a visszatérési típusban nem egyezik meg a felülírt tagokkal.
  • A cs8610 - hivatkozástípusok érvénytelensége a típusparaméterben nem egyezik meg a felülírt tagokkal.
  • A típusparaméterben lévő referenciatípusok CS8611-es - érvénytelensége nem egyezik a részleges metódusdeklarációval.
  • A cs8612 - típusú referenciatípusok nem egyeznek az implicit módon implementált tagokkal.
  • A hivatkozástípusok CS8613 - visszatérési típusban való nullbilitása nem egyezik meg az implicit módon implementált tagokkal.
  • A hivatkozástípusok CS8614 - paramétertípusban való nullabilitása nem egyezik az implicit módon implementált tagokkal.
  • A cs8615 - típusú referenciatípusok érvénytelensége nem egyezik a implementált tagokkal.
  • A cs8616 - visszatérési típusú referenciatípusok érvénytelensége nem egyezik a implementált tagokkal.
  • A hivatkozástípusok CS8617 - paramétertípusban való nullbilitása nem egyezik a implementált tagokkal.
  • A CS8618 - Nem null értékű változónak nem null értéket kell tartalmaznia a konstruktorból való kilépéskor. Fontolja meg a null értékű deklarálást.
  • A hivatkozástípusok CS8619 - értéke nem egyezik meg a céltípussal.
  • A CS8620 - argumentum nem használható paraméterhez a hivatkozástípusok érvénytelenségének különbségei miatt.
  • A visszatérési típusú referenciatípusok CS8621 - nullsága nem egyezik meg a céldelegáltéval (esetleg nullability attribútumok miatt).
  • A hivatkozástípusok CS8622 - paramétertípusban való nullabilitása nem egyezik meg a céldelegáltéval (esetleg nullability attribútumok miatt).
  • A CS8624 - argumentum nem használható kimenetként a hivatkozástípusok nullbilitásának különbségei miatt.
  • CS8625 - A null literál nem konvertálható nem null értékű hivatkozástípussá.
  • A CS8629 - null értékű lehet.
  • CS8631 - A típus nem használható típusparaméterként az általános típusban vagy metódusban. A típusargumentum érvénytelensége nem egyezik meg a kényszer típusával.
  • A CS8633 - a metódus típusparaméterének kényszereiben nem egyezik meg az interfészmetódus típusparaméterére vonatkozó korlátozásokkal. Fontolja meg inkább egy explicit felület implementálását.
  • CS8634 - A típus nem használható típusparaméterként az általános típusban vagy metódusban. A típusargumentum nullabilitása nem egyezik meg az "osztály" kényszerével.
  • A referenciatípusok CS8643-ban - való nullabilitása az explicit felületkijelölőben nem egyezik a típus által implementált felülettel.
  • A CS8644 - típus nem implementálja az illesztő tagot. Az alaptípus által implementált illesztőben lévő referenciatípusok érvénytelensége nem egyezik meg.
  • A CS8645 - Tag már szerepel az interfészlistában a hivatkozástípusok különböző null értékű típusára vonatkozóan.
  • CS8655 - A kapcsolókifejezés nem kezel null bemeneteket (nem teljes).
  • A CS8667 - részleges metódus deklarációi inkonzisztens nullhipotenciával rendelkeznek a típusparaméter korlátaiban.
  • A CS8670 - Objektum- vagy gyűjtemény-inicializáló implicit módon elhalasztja a lehetséges null tagot.
  • CS8714 - A típus nem használható típusparaméterként az általános típusban vagy metódusban. A típusargumentum nullabilitása nem egyezik a "notnull" kényszerével.
  • A CS8762 - paraméternek nem null értékűnek kell lennie kilépéskor.
  • CS8763 - A megjelölt [DoesNotReturn] metódus nem térhet vissza.
  • A CS8764 - visszatérési típusú nullabilitása nem egyezik a felülírt tagéval (valószínűleg nullability attribútumok miatt).
  • A CS8765 - paramétertípus nullabilitása nem egyezik a felülírt tagéval (valószínűleg nullability attribútumok miatt).
  • A hivatkozástípusok CS8766-os - nullabilitása a visszatérési típusban nem egyezik az implicit módon implementált tagéval (valószínűleg nullability attribútumok miatt).
  • A hivatkozástípusok CS8767 - paramétertípusban való nullabilitása nem egyezik az implicit módon implementált tagéval (esetleg nullability attribútumok miatt).
  • A cs8768 - visszatérési típusú referenciatípusok érvénytelensége nem egyezik a implementált tagéval (valószínűleg nullability attribútumok miatt).
  • A paramétertípusú referenciatípusok CS8769 - nullabilitása nem egyezik a implementált tagéval (esetleg nullability attribútumok miatt).
  • A CS8770 - metódus nem rendelkezik a implementált vagy felülbírált tagnak megfelelő széljegyzetekkel[DoesNotReturn].
  • A CS8774-tagnak - nem null értékűnek kell lennie kilépéskor.
  • A CS8776 - Tag nem használható ebben az attribútumban.
  • A CS8775-tagnak - nem null értékűnek kell lennie kilépéskor.
  • A CS8777 - paraméternek nem null értékűnek kell lennie kilépéskor.
  • A visszatérési típusú referenciatípusok CS8819 - érvénytelensége nem egyezik a részleges metódus deklarációval.
  • A CS8824 - paraméternek nem null értékűnek kell lennie a kilépéskor, mert a paraméter nem null.
  • A CS8825 - Visszatérési értéknek nem null értékűnek kell lennie, mert a paraméter nem null.
  • CS8847 - A kapcsolókifejezés nem kezel null bemeneteket (nem teljes). A "mikor" záradékkal rendelkező minta azonban sikeresen megfelelhet ennek az értéknek.

A null értékű figyelmeztetések célja, hogy minimalizálják annak az esélyét, hogy az alkalmazás futtatáskor adódik System.NullReferenceException . A cél elérése érdekében a fordító statikus elemzést használ, és figyelmeztetéseket ad ki, ha a kód olyan szerkezeteket tartalmaz, amelyek nullhivatkozási kivételekhez vezethetnek. Típusjegyzetek és attribútumok alkalmazásával információkat adhat meg a fordítónak a statikus elemzéshez. Ezek a széljegyzetek és attribútumok az argumentumok, paraméterek és a típusok tagjainak nullbilitását írják le. Ebben a cikkben különböző technikákat ismerhet meg a fordító által a statikus elemzésből generált null értékű figyelmeztetések kezelésére. Az itt ismertetett technikák az általános C# kódhoz tartoznak. Ismerje meg a null értékű referenciatípusok és az Entity Framework core használatát a null értékű referenciatípusok használata során.

A négy technika egyikével szinte minden figyelmeztetést kezelhet:

  • A szükséges null-ellenőrzések hozzáadása.
  • Széljegyzetek hozzáadása ? vagy ! null értékűvé nyilvánítása.
  • Null szemantikát leíró attribútumok hozzáadása.
  • A változók inicializálása helyesen.

A null lehetséges halasztása

Ez a figyelmeztetéskészlet figyelmezteti, hogy halaszt egy változót, amelynek null állapotalehet null. Ezek a figyelmeztetések a következők:

  • CS8602 - Lehetséges nullhivatkozás elhalasztása.
  • A CS8670 - Objektum- vagy gyűjtemény-inicializáló implicit módon elhalasztja a lehetséges null tagot.

Az alábbi kód az előző figyelmeztetések mindegyikére egy-egy példát mutat be:

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
}

A fenti példában a figyelmeztetés az, hogy a Container, cnull értékű lehet a States tulajdonsághoz. Ha új állapotokat rendel egy null értékű gyűjteményhez, az a figyelmeztetést okozza.

A figyelmeztetések eltávolításához fel kell vennie a kódot, hogy a változó null állapota ne null értékű legyen a halasztás előtt. A gyűjtemény inicializálójának figyelmeztetése nehezebb lehet. A fordító észleli, hogy a gyűjtemény null értékű , amikor az inicializáló elemeket ad hozzá.

Számos esetben kijavíthatja ezeket a figyelmeztetéseket, ha ellenőrzi, hogy egy változó nem null értékű-e a halasztás előtt. Vegye figyelembe az alábbiakat, amelyek null értékű ellenőrzést adnak hozzá a message paraméter elhalasztása előtt:

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

Az alábbi példa inicializálja a háttértárat, States és eltávolítja a tartozékot set . Az osztály felhasználói módosíthatják a gyűjtemény tartalmát, és a gyűjtemény tárterülete soha nem null:

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

Más példányok, amikor ezeket a figyelmeztetéseket kapja, hamis pozitívak lehetnek. Lehet, hogy rendelkezik egy privát segédprogrammal, amely null értéket tesztel. A fordító nem tudja, hogy a metódus null értékű ellenőrzést biztosít. Vegye figyelembe az alábbi példát, amely magánhálózati módszert használ: IsNotNull

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

A fordító figyelmezteti, hogy a tulajdonság message.Length írásakor előfordulhat, hogy a null értéket halasztja el, mert a statikus elemzés megállapítja, hogy message az lehet null. Lehet, hogy tudja, hogy IsNotNull null értékű ellenőrzést biztosít, és ha visszaadjatrue, a null-állapotnakmessage nem null értékűnek kell lennie. Ezeket a tényeket el kell mondania a fordítónak. Ennek egyik módja a null elbocsátó operátor használata. ! Az utasítást úgy WriteLine módosíthatja, hogy megfeleljen a következő kódnak:

Console.WriteLine(message!.Length);

A null elbocsátó operátor akkor is null értékűvé teszi a kifejezést, ha az alkalmazás nélkül ! is null értékű volt. Ebben a példában jobb megoldás, ha egy attribútumot ad hozzá a következő aláírásához IsNotNull:

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

A System.Diagnostics.CodeAnalysis.NotNullWhenAttribute fordító tájékoztatja a fordítót, hogy a obj paraméterhez használt argumentum nem null értékű a metódus visszatérésekor true. A metódus visszatérésekor falseaz argumentum null állapota megegyezik a metódus meghívása előtti null állapotával .

Tipp.

Számos attribútumot használhat a metódusok és tulajdonságok nullállapotra gyakorolt hatásának leírására. Ezekről a null értékű statikus elemzési attribútumokról szóló nyelvi referenciacikkben tájékozódhat.

A lehetséges null értékű változó elhalasztására vonatkozó figyelmeztetés kijavítása három módszer egyikét foglalja magában:

  • Hiányzó null értékű ellenőrzés hozzáadása.
  • Adjon hozzá nullelemzési attribútumokat az API-khoz, hogy hatással legyen a fordító nullállapotú statikus elemzésére. Ezek az attribútumok tájékoztatják a fordítót, ha a metódus meghívása után egy visszatérési értéknek vagy argumentumnak talán null vagy nem null értékűnek kell lennie.
  • Alkalmazza a null elbocsátó operátort ! a kifejezésre, hogy az állapot ne null értékű legyen.

Nem említhető hivatkozáshoz hozzárendelt lehetséges null érték

Ez a figyelmeztetési csoport figyelmezteti, hogy olyan változót rendel hozzá, amelynek típusa nem mondható el egy olyan kifejezéshez, amelynek null állapotatalán null. Ezek a figyelmeztetések a következők:

  • A CS8597 - Kidobott érték null értékű lehet.
  • CS8600 - Null literál vagy lehetséges null érték konvertálása nem null értékű típusra.
  • CS8601 - Lehetséges nullhivatkozás-hozzárendelés.
  • CS8603 - Lehetséges nullhivatkozási visszatérés.
  • CS8604 - Paraméter lehetséges nullhivatkozási argumentuma.
  • CS8605 - Lehetséges null érték kicsomagolása.
  • CS8625 - A null literál nem konvertálható nem null értékű hivatkozástípussá.
  • A CS8629 - null értékű lehet.

A fordító akkor bocsátja ki ezeket a figyelmeztetéseket, ha egy talán null értékű kifejezést próbál hozzárendelni egy nem mondható változóhoz. Példa:

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

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

A különböző figyelmeztetések a kód részleteit jelzik, például a hozzárendelést, a hozzárendelés feloldását, a visszatérési utasításokat, a metódusok argumentumait és a kifejezéseket.

A figyelmeztetések kezelése három művelet közül az egyiket végezheti el. Az egyik, hogy hozzáadja a ? széljegyzetet, hogy a változó null értékű hivatkozástípus legyen. Ez a változás más figyelmeztetéseket is okozhat. Ha egy változót nem null értékű hivatkozásról null értékű hivatkozásra módosít, az alapértelmezett null-állapotot a not-nullróla talán-null értékre módosítja. A fordító statikus elemzése olyan példányokat találhat, amelyekben egy esetleg null értékű változót dereferál.

A többi művelet arra utasítja a fordítót, hogy a hozzárendelés jobb oldala ne null értékű legyen. A jobb oldali kifejezés a hozzárendelés előtt null értékű lehet, ahogy az alábbi példában látható:

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

Az előző példák egy metódus visszatérési értékének hozzárendelését mutatják be. A metódust (vagy tulajdonságot) széljegyzetekkel jelezheti, ha egy metódus nem null értéket ad vissza. A System.Diagnostics.CodeAnalysis.NotNullIfNotNullAttribute függvény gyakran azt határozza meg, hogy a visszatérési érték nem null értékű, ha egy bemeneti argumentum nem null értékű. Egy másik lehetőség a null elbocsátó operátor ! hozzáadása a jobb oldalon:

string msg = TryGetMessage(42)!;

A nem null változóhoz rendelhető talán null értékű kifejezésekre vonatkozó figyelmeztetés kijavítása négy módszer egyikét foglalja magában:

  • Módosítsa a hozzárendelés bal oldalát null értékű típusra. Ez a művelet új figyelmeztetéseket eredményezhet a változó elhalasztásakor.
  • Adjon meg null-ellenőrzést a hozzárendelés előtt.
  • Jegyzetelje meg azt az API-t, amely a hozzárendelés jobb oldalát hozza létre.
  • Adja hozzá a null elbocsátó operátort a hozzárendelés jobb oldalához.

Nem említhető hivatkozás nem inicializálva

Ez a figyelmeztetési csoport figyelmezteti, hogy olyan változót rendel hozzá, amelynek típusa nem null értékű egy olyan kifejezéshez, amelynek null állapotalehet null. Ezek a figyelmeztetések a következők:

  • A CS8618 - Nem null értékű változónak nem null értéket kell tartalmaznia a konstruktorból való kilépéskor. Fontolja meg a null értékű deklarálást.
  • A CS8762 - paraméternek nem null értékűnek kell lennie kilépéskor.

Vegyük példaként a következő osztályt:

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

Sem inicializálás, sem FirstNameLastName garantált inicializálás. Ha ez a kód új, fontolja meg a nyilvános felület módosítását. A fenti példa a következőképpen frissíthető:

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

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

Ha a név megadása előtt létre kell hoznia egy Person objektumot, inicializálhatja a tulajdonságokat egy alapértelmezett nem null érték használatával:

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

Egy másik lehetőség az lehet, hogy ezeket a tagokat null értékű hivatkozástípusokra módosítja. Az Person osztályt a következőképpen lehet definiálni, ha null engedélyezni kell a nevet:

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

A meglévő kód további módosításokat is megkövetelhet, hogy tájékoztassa a fordítót a tagok null szemantikai értékéről. Előfordulhat, hogy több konstruktort hozott létre, és az osztály rendelkezhet egy vagy több tagot inicializáló magánsegítő metódussal. Az inicializálási kódot egyetlen konstruktorba helyezheti át, és biztosíthatja, hogy minden konstruktor meghívja a közös inicializálási kóddal rendelkezőt. Vagy használhatja az és System.Diagnostics.CodeAnalysis.MemberNotNullWhenAttribute az System.Diagnostics.CodeAnalysis.MemberNotNullAttribute attribútumokat. Ezek az attribútumok tájékoztatják a fordítót, hogy a metódus meghívása után a tag nem null értékű. Az alábbi kód mindegyikre mutat példát. Az Person osztály az összes többi konstruktor által hívott közös konstruktort használja. Az Student osztály egy segédmetódussal rendelkezik, amely a System.Diagnostics.CodeAnalysis.MemberNotNullAttribute következő attribútummal van eljegyzve:


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";
    }
}

Végül a null elbocsátó operátorral jelezheti, hogy egy tag inicializálva van más kódban. Egy másik példában vegye figyelembe az Entity Framework Core-modellt képviselő alábbi osztályokat:

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!;
}

A DbSet tulajdonság inicializálása a következőre történik null!: . Ez azt jelzi a fordítónak, hogy a tulajdonság értéke nem null értékű. Valójában az alap DbContext végrehajtja a készlet inicializálását. A fordító statikus elemzése nem veszi ezt fel. A null értékű referenciatípusok és az Entity Framework Core használatával kapcsolatos további információkért tekintse meg a null értékű referenciatípusok EF Core-ban való használatát ismertető cikket.

A nemjelentő tagok inicializálására vonatkozó figyelmeztetés kijavítása négy módszer egyikét foglalja magában:

  • Módosítsa a konstruktorokat vagy a mező inicializálóit, hogy minden nemnullálható tag inicializálva legyen.
  • Módosítsa egy vagy több tagot null értékű típusra.
  • Megjegyzést fűzhet az összes segédmetehez, amely jelzi, hogy mely tagok vannak hozzárendelve.
  • Adjon hozzá egy inicializálót null! , amely jelzi, hogy a tag inicializálva van más kódban.

Érvénytelenségi deklaráció eltérése

Számos figyelmeztetés arra utal, hogy a metódusok, meghatalmazottak vagy típusparaméterek aláírásai között nulladbilitási eltéréseket jeleznek.

  • A típusban lévő referenciatípusok CS8608 - nullíthatósága nem egyezik a felülírt tagokkal.
  • A cs8609 - hivatkozástípusok érvénytelensége a visszatérési típusban nem egyezik meg a felülírt tagokkal.
  • A cs8610 - hivatkozástípusok érvénytelensége a típusparaméterben nem egyezik meg a felülírt tagokkal.
  • A típusparaméterben lévő referenciatípusok CS8611-es - érvénytelensége nem egyezik a részleges metódusdeklarációval.
  • A cs8612 - típusú referenciatípusok nem egyeznek az implicit módon implementált tagokkal.
  • A hivatkozástípusok CS8613 - visszatérési típusban való nullbilitása nem egyezik meg az implicit módon implementált tagokkal.
  • A hivatkozástípusok CS8614 - paramétertípusban való nullabilitása nem egyezik az implicit módon implementált tagokkal.
  • A cs8615 - típusú referenciatípusok érvénytelensége nem egyezik a implementált tagokkal.
  • A cs8616 - visszatérési típusú referenciatípusok érvénytelensége nem egyezik a implementált tagokkal.
  • A hivatkozástípusok CS8617 - paramétertípusban való nullbilitása nem egyezik a implementált tagokkal.
  • A hivatkozástípusok CS8619 - értéke nem egyezik meg a céltípussal.
  • A CS8620 - argumentum nem használható paraméterhez a hivatkozástípusok érvénytelenségének különbségei miatt.
  • A visszatérési típusú referenciatípusok CS8621 - nullsága nem egyezik meg a céldelegáltéval (esetleg nullability attribútumok miatt).
  • A hivatkozástípusok CS8622 - paramétertípusban való nullabilitása nem egyezik meg a céldelegáltéval (esetleg nullability attribútumok miatt).
  • A CS8624 - argumentum nem használható kimenetként a hivatkozástípusok nullbilitásának különbségei miatt.
  • CS8631 - A típus nem használható típusparaméterként az általános típusban vagy metódusban. A típusargumentum érvénytelensége nem egyezik meg a kényszer típusával.
  • A CS8633 - a metódus típusparaméterének kényszereiben nem egyezik meg az interfészmetódus típusparaméterére vonatkozó korlátozásokkal. Fontolja meg inkább egy explicit felület implementálását.
  • CS8634 - A típus nem használható típusparaméterként az általános típusban vagy metódusban. A típusargumentum nullabilitása nem egyezik meg az "osztály" kényszerével.
  • A referenciatípusok CS8643-ban - való nullabilitása az explicit felületkijelölőben nem egyezik a típus által implementált felülettel.
  • A CS8644 - típus nem implementálja az illesztő tagot. Az alaptípus által implementált illesztőben lévő referenciatípusok érvénytelensége nem egyezik meg.
  • A CS8645 - Tag már szerepel az interfészlistában a hivatkozástípusok különböző null értékű típusára vonatkozóan.
  • A CS8667 - részleges metódus deklarációi inkonzisztens nullhipotenciával rendelkeznek a típusparaméter korlátaiban.
  • CS8714 - A típus nem használható típusparaméterként az általános típusban vagy metódusban. A típusargumentum nullabilitása nem egyezik a "notnull" kényszerével.
  • A CS8764 - visszatérési típusú nullabilitása nem egyezik a felülírt tagéval (valószínűleg nullability attribútumok miatt).
  • A CS8765 - paramétertípus nullabilitása nem egyezik a felülírt tagéval (valószínűleg nullability attribútumok miatt).
  • A hivatkozástípusok CS8766-os - nullabilitása a visszatérési típusban nem egyezik az implicit módon implementált tagéval (valószínűleg nullability attribútumok miatt).
  • A hivatkozástípusok CS8767 - paramétertípusban való nullabilitása nem egyezik az implicit módon implementált tagéval (esetleg nullability attribútumok miatt).
  • A cs8768 - visszatérési típusú referenciatípusok érvénytelensége nem egyezik a implementált tagéval (valószínűleg nullability attribútumok miatt).
  • A paramétertípusú referenciatípusok CS8769 - nullabilitása nem egyezik a implementált tagéval (esetleg nullability attribútumok miatt).
  • A visszatérési típusú referenciatípusok CS8819 - érvénytelensége nem egyezik a részleges metódus deklarációval.

Az alábbi kód a CS8764-et mutatja be:

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

Az előző példa egy virtual alaposztályban lévő metódust és egy eltérő nullértékű metódust override mutat be. Az alaposztály nem null értékű sztringet ad vissza, a származtatott osztály viszont null értékű karakterláncot ad vissza. Ha az string és string? fordított, akkor az engedélyezve lesz, mert a származtatott osztály szigorúbb. Hasonlóképpen, a paraméterdeklarációknak egyeznie kell. A felülbírálási metódus paraméterei akkor is engedélyezhetik a null értéket, ha az alaposztály nem.

Más helyzetek is létrehozhatják ezeket a figyelmeztetéseket. Előfordulhat, hogy egy interfészmetódus-deklarációban és a metódus implementálásában eltérés van. Delegált típusa és kifejezése eltérhet. A típusparaméter és a típusargumentum érvénytelensége eltérhet.

A figyelmeztetések kijavításához frissítse a megfelelő deklarációt.

A kód nem egyezik az attribútumdeklarációval

Az előző szakaszokban bemutattuk, hogyan használható attribútumok null értékű statikus elemzéshez , hogy tájékoztassa a fordítót a kód null szemantikáról. A fordító figyelmezteti, ha a kód nem felel meg az attribútum ígéreteinek:

  • CS8607 - Lehetséges null érték nem használható olyan típushoz, amely [NotNull][DisallowNull]
  • CS8763 - A megjelölt [DoesNotReturn] metódus nem térhet vissza.
  • A CS8770 - metódus nem rendelkezik a implementált vagy felülbírált tagnak megfelelő széljegyzetekkel[DoesNotReturn].
  • A CS8774-tagnak - nem null értékűnek kell lennie kilépéskor.
  • A CS8775-tagnak - nem null értékűnek kell lennie kilépéskor.
  • A CS8776 - Tag nem használható ebben az attribútumban.
  • A CS8777 - paraméternek nem null értékűnek kell lennie kilépéskor.
  • A CS8824 - paraméternek nem null értékűnek kell lennie a kilépéskor, mert a paraméter nem null.
  • A CS8825 - Visszatérési értéknek nem null értékűnek kell lennie, mert a paraméter nem null.

Fontolja meg a következő módszert:

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

}

A fordító figyelmeztetést hoz létre, mert a message paraméter hozzá van rendelve null, és a metódus visszaadja true. Az NotNullWhen attribútum azt jelzi, hogy nem szabad megtörténnie.

A figyelmeztetések kezeléséhez frissítse a kódot úgy, hogy az megfeleljen az alkalmazott attribútumok elvárásainak. Módosíthatja az attribútumokat vagy az algoritmust.

Teljes kapcsolókifejezés

A kapcsolókifejezéseknek teljesnek kell lenniük, ami azt jelenti, hogy minden bemeneti értéket kezelni kell. Még a nem null értékű referenciatípusok esetében is figyelembe kell venni az null értéket. A fordító figyelmeztetéseket ad ki, ha a null értéket nem kezeli a rendszer:

  • CS8655 - A kapcsolókifejezés nem kezel null bemeneteket (nem teljes).
  • CS8847 - A kapcsolókifejezés nem kezel null bemeneteket (nem teljes). A "mikor" záradékkal rendelkező minta azonban sikeresen megfelelhet ennek az értéknek.

Az alábbi példakód ezt a feltételt mutatja be:

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

A bemeneti kifejezés nem stringstring?. A fordító továbbra is létrehozza ezt a figyelmeztetést. A { } minta az összes nem null értéket kezeli, de nem egyezik.null A hibák elhárításához hozzáadhat egy explicit null esetet, vagy lecserélheti a { }_ (elvetési) mintát. Az elvetési minta megegyezik a null értékkel, valamint bármely más értékkel.