Share via


Boş değer atanabilir uyarıları çözme

Bu makale aşağıdaki derleyici uyarılarını kapsar:

  • CS8597 - Oluşturuldu değeri null olabilir.
  • CS8600 - Null değişmez değeri veya olası null değeri null atanamaz türe dönüştürme.
  • CS8601 - Olası null başvuru ataması.
  • CS8602 - Büyük olasılıkla null başvurunun başvurusu geri döndürülmüş.
  • CS8603 - Olası null başvuru dönüşü.
  • CS8604 - Parametre için olası null başvuru bağımsız değişkeni.
  • CS8605 - Büyük olasılıkla null bir değerin kutusunu açma.
  • CS8607 - veya ile [NotNull] işaretlenmiş bir tür için olası bir null değer kullanılamayabilir[DisallowNull]
  • CS8608 - Türdeki başvuru türlerinin null atanabilirliği geçersiz kılınan üyeyle eşleşmiyor.
  • Dönüş türündeki başvuru türlerinin CS8609 - Null atanabilirliği geçersiz kılınan üyeyle eşleşmiyor.
  • TÜR parametresindeki başvuru türlerinin CS8610 - Null atanabilirliği geçersiz kılınan üyeyle eşleşmiyor.
  • CS8611 - Tür parametresindeki başvuru türlerinin null atanabilirliği kısmi yöntem bildirimiyle eşleşmiyor.
  • CS8612 - Türdeki başvuru türlerinin null atanabilirliği örtük olarak uygulanan üyeyle eşleşmiyor.
  • CS8613 - Dönüş türündeki başvuru türlerinin null atanabilirliği örtük olarak uygulanan üyeyle eşleşmiyor.
  • CS8614 - Parametre türündeki başvuru türlerinin null atanabilirliği örtük olarak uygulanan üyeyle eşleşmiyor.
  • CS8615 - Türdeki başvuru türlerinin null atanabilirliği, uygulanan üyeyle eşleşmiyor.
  • Dönüş türündeki başvuru türlerinin CS8616 - Null atanabilirliği, uygulanan üyeyle eşleşmiyor.
  • CS8617 - Parametre türündeki başvuru türlerinin null atanabilirliği, uygulanan üyeyle eşleşmiyor.
  • CS8618 - Null değer atanamayan değişken oluşturucudan çıkarken null olmayan bir değer içermelidir. Bunu null atanabilir olarak bildirmeyi göz önünde bulundurun.
  • CS8619 - Değerdeki başvuru türlerinin null atanabilirliği hedef türle eşleşmiyor.
  • Cs8620 - Bağımsız Değişkeni, başvuru türlerinin null atanabilirliğindeki farklılıklar nedeniyle parametre için kullanılamaz.
  • DÖNÜŞ türündeki başvuru türlerinin CS8621 - Null atanabilirliği hedef temsilciyle eşleşmiyor (büyük olasılıkla null atanabilirlik öznitelikleri nedeniyle).
  • CS8622 - Parametre türündeki başvuru türlerinin null atanabilirliği hedef temsilciyle eşleşmiyor (büyük olasılıkla null atanabilirlik öznitelikleri nedeniyle).
  • CS8624 - Bağımsız Değişkeni, başvuru türlerinin null atanabilirliğindeki farklılıklar nedeniyle çıkış olarak kullanılamaz.
  • CS8625 - Null değişmez değeri null atanamaz başvuru türüne dönüştürülemez.
  • CS8629 - Null değer türü null olabilir.
  • CS8631 - Tür, genel tür veya yöntemde tür parametresi olarak kullanılamaz. Tür bağımsız değişkeninin null atanabilirliği kısıtlama türüyle eşleşmiyor.
  • CS8633 - Yöntemin tür parametresi kısıtlamalarında null atanabilirlik, arabirim yönteminin tür parametresi kısıtlamalarıyla eşleşmiyor. Bunun yerine açık bir arabirim uygulaması kullanmayı göz önünde bulundurun.
  • CS8634 - Tür, genel tür veya yöntemde tür parametresi olarak kullanılamaz. Tür bağımsız değişkeninin null atanabilirliği 'sınıf' kısıtlaması ile eşleşmiyor.
  • CS8643 - Açık arabirim tanımlayıcısında başvuru türlerinin null atanabilirliği, türü tarafından uygulanan arabirimle eşleşmiyor.
  • CS8644 - Türü arabirim üyesi uygulamaz. Temel tür tarafından uygulanan arabirimdeki başvuru türlerinin null atanabilirliği eşleşmiyor.
  • CS8645 - Üyesi, başvuru türlerinin farklı null atanabilirliğine sahip arabirim listesinde zaten listelenmiştir.
  • CS8655 - Switch ifadesi bazı null girişleri işlemez (kapsamlı değildir).
  • CS8667 - Kısmi yöntem bildirimleri, tür parametresi kısıtlamalarında tutarsız null atanabilirliğe sahiptir.
  • CS8670 - Nesne veya koleksiyon başlatıcısı örtük olarak null üye başvurularını kaldırır.
  • CS8714 - Tür, genel tür veya yöntemde tür parametresi olarak kullanılamaz. Tür bağımsız değişkeninin null atanabilirliği 'notnull' kısıtlaması ile eşleşmiyor.
  • CS8762 - Parametresi çıkış sırasında null olmayan bir değere sahip olmalıdır.
  • CS8763 - İşaretlenen [DoesNotReturn] bir yöntem döndürülmemelidir.
  • Dönüş türünün CS8764 - Null atanabilirliği geçersiz kılınan üyeyle eşleşmiyor (büyük olasılıkla null atanabilirlik öznitelikleri nedeniyle).
  • Parametre türünün CS8765 - Null atanabilirliği geçersiz kılınan üyeyle eşleşmiyor (büyük olasılıkla null atanabilirlik öznitelikleri nedeniyle).
  • CS8766 - Dönüş türündeki başvuru türlerinin Null atanabilirliği örtük olarak uygulanan üyeyle eşleşmiyor (büyük olasılıkla null atanabilirlik öznitelikleri nedeniyle).
  • PARAMETRESI türündeki başvuru türlerinin CS8767 - Null atanabilirliği örtük olarak uygulanan üyeyle eşleşmiyor (büyük olasılıkla null atanabilirlik öznitelikleri nedeniyle).
  • Dönüş türündeki başvuru türlerinin CS8768 - Null atanabilirliği, uygulanan üyeyle eşleşmiyor (büyük olasılıkla null atanabilirlik öznitelikleri nedeniyle).
  • Cs8769 - Parametre türündeki başvuru türlerinin null atanabilirliği uygulanan üyeyle eşleşmiyor (büyük olasılıkla null atanabilirlik öznitelikleri nedeniyle).
  • CS8770 - Yönteminde [DoesNotReturn] uygulanan veya geçersiz kılınan üyeyle eşleşecek ek açıklama yok.
  • CS8774 - Üyesi çıkış sırasında null olmayan bir değere sahip olmalıdır.
  • CS8776 - Üyesi bu öznitelikte kullanılamaz.
  • CS8775 - Üyesi çıkarken null olmayan bir değere sahip olmalıdır.
  • CS8777 - Parametresi çıkış sırasında null olmayan bir değere sahip olmalıdır.
  • DÖNÜŞ türündeki başvuru türlerinin CS8819 - Null atanabilirliği kısmi yöntem bildirimiyle eşleşmiyor.
  • CS8824 - Parametresi, çıkış sırasında null olmayan bir değere sahip olmalıdır çünkü parametre null değildir.
  • PARAMETRE null olmadığından CS8825 - Dönüş değeri null olmamalıdır.
  • CS8847 - Switch ifadesi bazı null girişleri işlemez (kapsamlı değildir). Ancak, 'when' yan tümcesine sahip bir desen bu değerle başarıyla eşleşebilir.

Null atanabilir uyarıların amacı, uygulamanızın çalıştırıldığında oluşturma System.NullReferenceException olasılığını en aza indirmektir. Bu hedefe ulaşmak için, derleyici statik çözümleme kullanır ve kodunuzun null başvuru özel durumlarına yol açabilecek yapıları olduğunda uyarılar döndürür. Tür ek açıklamaları ve öznitelikleri uygulayarak derleyiciye statik çözümlemesi için bilgi sağlarsınız. Bu ek açıklamalar ve öznitelikler, bağımsız değişkenlerin, parametrelerin ve türlerinizin üyelerinin null atanabilirliğini açıklar. Bu makalede, derleyicinin statik çözümlemesinden oluşturduğu null atanabilir uyarıları ele almak için farklı teknikler öğreneceksiniz. Burada açıklanan teknikler genel C# koduna yöneliktir. Boş değer atanabilir başvuru türleriyle çalışma bölümünde null atanabilir başvuru türleri ve Entity Framework çekirdeği ile çalışmayı öğrenin.

Dört teknikten birini kullanarak neredeyse tüm uyarıları ele alacağız:

  • Gerekli null denetimleri ekleniyor.
  • Ek açıklamalar ekleme ? veya ! boş değer atanabilir.
  • Null semantiği açıklayan öznitelikler ekleme.
  • Değişkenleri doğru başlatma.

Null için olası başvuru kaldırma

Bu uyarı kümesi, null durumu belki de null olan bir değişkenin başvurularını kaldırdığınız konusunda sizi uyarır. Bu uyarılar şunlardır:

  • CS8602 - Büyük olasılıkla null başvurunun başvurusu geri döndürülmüş.
  • CS8670 - Nesne veya koleksiyon başlatıcısı örtük olarak null üye başvurularını kaldırır.

Aşağıdaki kod, önceki uyarıların her birine bir örnek gösterir:

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
}

Yukarıdaki örnekte uyarının nedeni, , cdeğerinin Containerözelliği için null değere States sahip olmasıdır. Null olabilecek bir koleksiyona yeni durumlar atamak uyarıya neden olur.

Bu uyarıları kaldırmak için, başvuruyu kaldırmadan önce bu değişkenin null durumunu not-null olarak değiştirmek için kod eklemeniz gerekir. Koleksiyon başlatıcı uyarısını saptamak daha zor olabilir. Derleyici, başlatıcı öğe eklediğinde koleksiyonun belki null olduğunu algılar.

Çoğu durumda, bir değişkenin başvuruyu kaldırmadan önce null olmadığını denetleyerek bu uyarıları düzeltebilirsiniz. Parametresinin başvurularını kaldırmadan önce null denetim ekleyen aşağıdakileri message göz önünde bulundurun:

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

Aşağıdaki örnek için States yedekleme depolama alanını başlatır ve erişimciyi set kaldırır. sınıfının tüketicileri koleksiyonun içeriğini değiştirebilir ve koleksiyonun depolama alanı hiçbir zaman null:

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

Bu uyarıları aldığınızda diğer örnekler hatalı pozitif olabilir. Null için test eden özel bir yardımcı program yönteminiz olabilir. Derleyici, yönteminin null denetim sağladığını bilmiyor. Özel bir yardımcı program yöntemi kullanan aşağıdaki örneği göz önünde bulundurun: IsNotNull

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

Derleyici, özelliği yazarken message.Length null başvurusunu kaldırabileceğiniz konusunda uyarır çünkü statik çözümlemesi bunun message olabileceğini nullbelirler. Bunun null denetim sağladığını ve döndürdüğünde truenull durumunun messagenull olmaması gerektiğini biliyor IsNotNull olabilirsiniz. Derleyiciye bu gerçekleri anlatmalısınız. Bunun bir yolu null forgiving işlecini !kullanmaktır. Deyimini WriteLine aşağıdaki kodla eşleşecek şekilde değiştirebilirsiniz:

Console.WriteLine(message!.Length);

Null forgiving işleci, uygulanmamış olabilir-null olsa bile ifadeyi !null yapmaz. Bu örnekte, imzasına bir öznitelik eklemek daha iyi bir çözümdür IsNotNull:

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

yöntemi System.Diagnostics.CodeAnalysis.NotNullWhenAttribute döndürdüğünde trueparametresi için kullanılan bağımsız değişkenin obj null olmadığını derleyiciye bildirir. yöntemi döndürdüğündefalse, bağımsız değişken yöntemi çağrılmadan önce sahip olduğu null-durumla aynı olur.

İpucu

Yöntemlerinizin ve özelliklerinizin null durumunu nasıl etkilediğini açıklamak için kullanabileceğiniz zengin bir öznitelik kümesi vardır. Bunlar hakkında bilgi edinmek için Null atanabilir statik analiz öznitelikleri hakkındaki dil başvuru makalesinde bulabilirsiniz.

Belki-null değişken başvurusu kaldırma uyarısını düzeltmek için üç teknikten biri gerekir:

  • Eksik null denetimi ekleyin.
  • Derleyicinin null durum statik çözümlemesini etkilemek için API'lere null çözümleme öznitelikleri ekleyin. Bu öznitelikler, yöntemi çağrıldıktan sonra bir dönüş değeri veya bağımsız değişkeninin belki-null veya not-null olması gerektiğinde derleyiciyi bilgilendirmektedir.
  • Durumu null olmayan duruma zorlamak için ifadeye null bağışlayıcı işlecini ! uygulayın.

Geçersiz olmayan bir başvuruya olası null atandı

Bu uyarı kümesi, null durumubelki null olan bir ifadeye türü geçersiz olan bir değişken atadığınız konusunda sizi uyarır. Bu uyarılar şunlardır:

  • CS8597 - Oluşturuldu değeri null olabilir.
  • CS8600 - Null değişmez değeri veya olası null değeri null atanamaz türe dönüştürme.
  • CS8601 - Olası null başvuru ataması.
  • CS8603 - Olası null başvuru dönüşü.
  • CS8604 - Parametre için olası null başvuru bağımsız değişkeni.
  • CS8605 - Büyük olasılıkla null bir değerin kutusunu açma.
  • CS8625 - Null değişmez değeri null atanamaz başvuru türüne dönüştürülemez.
  • CS8629 - Null değer türü null olabilir.

Derleyici, geçersiz olmayan bir değişkene belki-null olan bir ifade atamaya çalıştığınızda bu uyarıları yayar. Örneğin:

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

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

Farklı uyarılar, kodla ilgili atama, atamayı kaldırma, dönüş deyimleri, yöntemlere yönelik bağımsız değişkenler ve ifadeler oluşturma gibi ayrıntıları sağlar.

Bu uyarıları ele almak için üç eylemden birini gerçekleştirebilirsiniz. Bunlardan biri, değişkeni null atanabilir başvuru türü yapmak için ek açıklamayı eklemektir ? . Bu değişiklik başka uyarılara neden olabilir. Bir değişkeni null atanamayan başvurudan null atanabilir başvuruya değiştirmek, varsayılan null durumunu null olmayandan belki-null olarak değiştirir. Derleyicinin statik analizi, belki null olan bir değişkene başvurduğunuz örnekleri bulabilir.

Diğer eylemler derleyiciye atamanın sağ tarafının null olmadığını gösterir. Sağ taraftaki ifade, aşağıdaki örnekte gösterildiği gibi atamadan önce null olarak denetlenebilir:

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

Önceki örneklerde bir yöntemin dönüş değerinin ataması gösterilmektedir. Bir yöntemin null olmayan bir değer döndürdüğünde belirtmek için yöntemine (veya özelliğine) açıklama ekleyebilirsiniz. genellikle System.Diagnostics.CodeAnalysis.NotNullIfNotNullAttribute bir giriş bağımsız değişkeni null olmadığında dönüş değerinin null olmadığını belirtir. Bir diğer alternatif de null forgiving işlecini ! sağ tarafa eklemektir:

string msg = TryGetMessage(42)!;

Null olmayan bir değişkene belki-null ifadesi atama uyarısını düzeltmek dört teknikten birini içerir:

  • Atamanın sol tarafını null atanabilir bir türe değiştirin. Bu eylem, bu değişkene başvuruyu kaldırdığınızda yeni uyarılar verebilir.
  • Atamadan önce null denetimi sağlayın.
  • Atamanın sağ tarafını oluşturan API'ye açıklama ekleme.
  • Null forgiving işlecini atamanın sağ tarafına ekleyin.

Iptal edilemeyen başvuru başlatılmadı

Bu uyarı kümesi, null durumubelki null olan bir ifadeye türü null atanamayan bir değişken atadığınız konusunda sizi uyarır. Bu uyarılar şunlardır:

  • CS8618 - Null değer atanamayan değişken oluşturucudan çıkarken null olmayan bir değer içermelidir. Bunu null atanabilir olarak bildirmeyi göz önünde bulundurun.
  • CS8762 - Parametresi çıkış sırasında null olmayan bir değere sahip olmalıdır.

Örnek olarak aşağıdaki sınıfı göz önünde bulundurun:

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

Ne FirstName de LastName garantili olarak başlatılmaz. Bu kod yeniyse genel arabirimi değiştirmeyi göz önünde bulundurun. Yukarıdaki örnek aşağıdaki gibi güncelleştirilebilir:

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

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

Adı ayarlamadan önce bir Person nesne oluşturmanız gerekiyorsa, varsayılan null olmayan bir değer kullanarak özellikleri başlatabilirsiniz:

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

Diğer bir alternatif de bu üyeleri null atanabilir başvuru türlerine dönüştürmek olabilir. Ad Person için izin verilmesi gerekiyorsa sınıfı aşağıdaki null gibi tanımlanabilir:

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

Mevcut kod, derleyiciyi bu üyeler için null semantiği hakkında bilgilendirmek için başka değişiklikler gerektirebilir. Birden çok oluşturucu oluşturmuş olabilirsiniz ve sınıfınızın bir veya daha fazla üyeyi başlatan özel bir yardımcı yöntemi olabilir. Başlatma kodunu tek bir oluşturucuya taşıyabilir ve tüm oluşturucuların ortak başlatma koduna sahip olanı çağırdığından emin olabilirsiniz. Veya ve System.Diagnostics.CodeAnalysis.MemberNotNullWhenAttribute özniteliklerini kullanabilirsinizSystem.Diagnostics.CodeAnalysis.MemberNotNullAttribute. Bu öznitelikler, yöntem çağrıldıktan sonra derleyiciye bir üyenin null olmadığını bildirir. Aşağıdaki kodda her birinin bir örneği gösterilmektedir. sınıfı, Person diğer tüm oluşturucular tarafından çağrılan ortak bir oluşturucu kullanır. sınıfı, Student özniteliğiyle ek açıklamalı bir yardımcı yöntemine System.Diagnostics.CodeAnalysis.MemberNotNullAttribute sahiptir:


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

Son olarak, bir üyenin başka bir kodda başlatıldığını belirtmek için null forgiving işlecini kullanabilirsiniz. Başka bir örnek için bir Entity Framework Core modelini temsil eden aşağıdaki sınıfları göz önünde bulundurun:

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

DbSet özelliği olarak null!başlatılır. Bu, derleyiciye özelliğin null olmayan bir değere ayarlandığını bildirir. Aslında, temel DbContext kümenin başlatılmasını gerçekleştirir. Derleyicinin statik analizi bunu almaz. Null atanabilir başvuru türleri ve Entity Framework Core ile çalışma hakkında daha fazla bilgi için EF Core'da Null Atanabilir Başvuru Türleriyle Çalışma makalesine bakın.

Iptal edilemeyen bir üyeyi başlatmamaya yönelik bir uyarının düzeltilmesi dört teknikten birini içerir:

  • Kaldırılamayan tüm üyelerin başlatıldığından emin olmak için oluşturucuları veya alan başlatıcılarını değiştirin.
  • Bir veya daha fazla üyeyi null atanabilir türler olacak şekilde değiştirin.
  • Hangi üyelerin atandığı belirtmek için yardımcı yöntemlere açıklama ekleyin.
  • Üyesinin başka bir kodda başlatıldığını belirtmek için null! öğesine bir başlatıcı ekleyin.

Null atanabilirlik bildiriminde uyuşmazlık

Birçok uyarı, yöntemler, temsilciler veya tür parametreleri için imzalar arasındaki null atanabilirlik uyuşmazlıklarını gösterir.

  • CS8608 - Türdeki başvuru türlerinin null atanabilirliği geçersiz kılınan üyeyle eşleşmiyor.
  • Dönüş türündeki başvuru türlerinin CS8609 - Null atanabilirliği geçersiz kılınan üyeyle eşleşmiyor.
  • TÜR parametresindeki başvuru türlerinin CS8610 - Null atanabilirliği geçersiz kılınan üyeyle eşleşmiyor.
  • CS8611 - Tür parametresindeki başvuru türlerinin null atanabilirliği kısmi yöntem bildirimiyle eşleşmiyor.
  • CS8612 - Türdeki başvuru türlerinin null atanabilirliği örtük olarak uygulanan üyeyle eşleşmiyor.
  • CS8613 - Dönüş türündeki başvuru türlerinin null atanabilirliği örtük olarak uygulanan üyeyle eşleşmiyor.
  • CS8614 - Parametre türündeki başvuru türlerinin null atanabilirliği örtük olarak uygulanan üyeyle eşleşmiyor.
  • CS8615 - Türdeki başvuru türlerinin null atanabilirliği, uygulanan üyeyle eşleşmiyor.
  • Dönüş türündeki başvuru türlerinin CS8616 - Null atanabilirliği, uygulanan üyeyle eşleşmiyor.
  • CS8617 - Parametre türündeki başvuru türlerinin null atanabilirliği, uygulanan üyeyle eşleşmiyor.
  • CS8619 - Değerdeki başvuru türlerinin null atanabilirliği hedef türle eşleşmiyor.
  • Cs8620 - Bağımsız Değişkeni, başvuru türlerinin null atanabilirliğindeki farklılıklar nedeniyle parametre için kullanılamaz.
  • DÖNÜŞ türündeki başvuru türlerinin CS8621 - Null atanabilirliği hedef temsilciyle eşleşmiyor (büyük olasılıkla null atanabilirlik öznitelikleri nedeniyle).
  • CS8622 - Parametre türündeki başvuru türlerinin null atanabilirliği hedef temsilciyle eşleşmiyor (büyük olasılıkla null atanabilirlik öznitelikleri nedeniyle).
  • CS8624 - Bağımsız Değişkeni, başvuru türlerinin null atanabilirliğindeki farklılıklar nedeniyle çıkış olarak kullanılamaz.
  • CS8631 - Tür, genel tür veya yöntemde tür parametresi olarak kullanılamaz. Tür bağımsız değişkeninin null atanabilirliği kısıtlama türüyle eşleşmiyor.
  • CS8633 - Yöntemin tür parametresi kısıtlamalarında null atanabilirlik, arabirim yönteminin tür parametresi kısıtlamalarıyla eşleşmiyor. Bunun yerine açık bir arabirim uygulaması kullanmayı göz önünde bulundurun.
  • CS8634 - Tür, genel tür veya yöntemde tür parametresi olarak kullanılamaz. Tür bağımsız değişkeninin null atanabilirliği 'sınıf' kısıtlaması ile eşleşmiyor.
  • CS8643 - Açık arabirim tanımlayıcısında başvuru türlerinin null atanabilirliği, türü tarafından uygulanan arabirimle eşleşmiyor.
  • CS8644 - Türü arabirim üyesi uygulamaz. Temel tür tarafından uygulanan arabirimdeki başvuru türlerinin null atanabilirliği eşleşmiyor.
  • CS8645 - Üyesi, başvuru türlerinin farklı null atanabilirliğine sahip arabirim listesinde zaten listelenmiştir.
  • CS8667 - Kısmi yöntem bildirimleri, tür parametresi kısıtlamalarında tutarsız null atanabilirliğe sahiptir.
  • CS8714 - Tür, genel tür veya yöntemde tür parametresi olarak kullanılamaz. Tür bağımsız değişkeninin null atanabilirliği 'notnull' kısıtlaması ile eşleşmiyor.
  • Dönüş türünün CS8764 - Null atanabilirliği geçersiz kılınan üyeyle eşleşmiyor (büyük olasılıkla null atanabilirlik öznitelikleri nedeniyle).
  • Parametre türünün CS8765 - Null atanabilirliği geçersiz kılınan üyeyle eşleşmiyor (büyük olasılıkla null atanabilirlik öznitelikleri nedeniyle).
  • CS8766 - Dönüş türündeki başvuru türlerinin Null atanabilirliği örtük olarak uygulanan üyeyle eşleşmiyor (büyük olasılıkla null atanabilirlik öznitelikleri nedeniyle).
  • PARAMETRESI türündeki başvuru türlerinin CS8767 - Null atanabilirliği örtük olarak uygulanan üyeyle eşleşmiyor (büyük olasılıkla null atanabilirlik öznitelikleri nedeniyle).
  • Dönüş türündeki başvuru türlerinin CS8768 - Null atanabilirliği, uygulanan üyeyle eşleşmiyor (büyük olasılıkla null atanabilirlik öznitelikleri nedeniyle).
  • Cs8769 - Parametre türündeki başvuru türlerinin null atanabilirliği uygulanan üyeyle eşleşmiyor (büyük olasılıkla null atanabilirlik öznitelikleri nedeniyle).
  • DÖNÜŞ türündeki başvuru türlerinin CS8819 - Null atanabilirliği kısmi yöntem bildirimiyle eşleşmiyor.

Aşağıdaki kod CS8764'i gösterir:

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

Yukarıdaki örnekte temel sınıftaki bir virtual yöntem ve farklı null atanabilirlik özelliğine sahip bir override yöntem gösterilmektedir. Temel sınıf null değer atanamayan bir dize döndürür, ancak türetilen sınıf null atanabilir bir dize döndürür. string ve string? tersine çevrilirse, türetilen sınıf daha kısıtlayıcı olduğundan buna izin verilir. Benzer şekilde, parametre bildirimleri de eşleşmelidir. Geçersiz kılma yöntemindeki parametreler, temel sınıf izin vermese bile null'a izin verebilir.

Diğer durumlar bu uyarıları oluşturabilir. Arabirim yöntemi bildiriminde ve bu yöntemin uygulanmasında uyuşmazlık olabilir. Veya bir temsilci türü ve bu temsilcinin ifadesi farklı olabilir. Tür parametresi ve tür bağımsız değişkeni null atanabilirlik açısından farklılık gösterebilir.

Bu uyarıları düzeltmek için uygun bildirimi güncelleştirin.

Kod öznitelik bildirimiyle eşleşmiyor

Yukarıdaki bölümlerde, derleyiciye kodunuzun null semantiği hakkında bilgi vermek üzere null atanabilir statik analiz için Öznitelikleri nasıl kullanabileceğiniz açıklanmıştır. Kod bu özniteliğin vaatlerine uymazsa derleyici sizi uyarır:

  • CS8607 - veya ile [NotNull] işaretlenmiş bir tür için olası bir null değer kullanılamayabilir [DisallowNull]
  • CS8763 - İşaretlenen [DoesNotReturn] bir yöntem döndürülmemelidir.
  • CS8770 - Yönteminde [DoesNotReturn] uygulanan veya geçersiz kılınan üyeyle eşleşecek ek açıklama yok.
  • CS8774 - Üyesi çıkış sırasında null olmayan bir değere sahip olmalıdır.
  • CS8775 - Üyesi çıkarken null olmayan bir değere sahip olmalıdır.
  • CS8776 - Üyesi bu öznitelikte kullanılamaz.
  • CS8777 - Parametresi çıkış sırasında null olmayan bir değere sahip olmalıdır.
  • CS8824 - Parametresi, çıkış sırasında null olmayan bir değere sahip olmalıdır çünkü parametre null değildir.
  • PARAMETRE null olmadığından CS8825 - Dönüş değeri null olmamalıdır.

Aşağıdaki yöntemi göz önünde bulundurun:

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

}

parametresi atandığından ve yöntemi döndürdüğünden messagetruenullderleyici bir uyarı üretir. NotNullWhen özniteliği bunun olmaması gerektiğini gösterir.

Bu uyarıları gidermek için kodunuzu, uyguladığınız özniteliklerin beklentileriyle eşleşecek şekilde güncelleştirin. Öznitelikleri veya algoritmayı değiştirebilirsiniz.

Kapsamlı anahtar ifadesi

Anahtar ifadeleri kapsamlı olmalıdır, yani tüm giriş değerlerinin işlenmesi gerekir. Null değer atanamayan başvuru türleri için bile değerin null hesaba katması gerekir. Null değer işlenmediğinde derleyici uyarı verir:

  • CS8655 - Switch ifadesi bazı null girişleri işlemez (kapsamlı değildir).
  • CS8847 - Switch ifadesi bazı null girişleri işlemez (kapsamlı değildir). Ancak, 'when' yan tümcesine sahip bir desen bu değerle başarıyla eşleşebilir.

Aşağıdaki örnek kod bu koşulu gösterir:

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

Giriş ifadesi, stringbir değil , şeklindedir string?. Derleyici yine de bu uyarıyı oluşturur. Desen { } null olmayan tüm değerleri işler, ancak ile eşleşmez null. Bu hataları gidermek için açık null bir servis talebi ekleyebilir veya öğesini (atma) deseniyle _ değiştirebilirsiniz{ }. Atma deseni, null ile ve diğer değerle eşleşir.