Aracılığıyla paylaş


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

Null atanabilir uyarıların amacı, uygulamanız çalıştırıldığında bir System.NullReferenceException hatası verme 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 olabilme durumunu 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. Null atanabilir başvuru türleri başlıklı bölümde null atanabilir başvuru türleri ve Entity Framework Core ile çalışmayı öğrenin.

? ve ! işleçleri de dahil olmak üzere, nullable referans türlerine yalnızca nullable bağlamın enable veya annotationsolarak ayarlandığında izin verilir. Proje dosyanızdaNullable derleyici seçeneğini kullanarak veya kaynak kodunuzda #nullable pragması kullanarak null atanabilir bağlamı ayarlayabilirsiniz.

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

  • CS8597 - Atılan değerin null olabilir.
  • CS8598 - Bu bağlamda gizleme işlecine izin verilmez
  • 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 - Muhtemelen null bir referansın başvurusu.
  • CS8603 - Olası null başvuru döndürmesi.
  • CS8604 - Parametre için olası null referans bağımsız değişkeni.
  • CS8605 - Muhtemelen null olabilecek bir değeri çözme.
  • CS8607 - ile işaretlenmiş bir tür için olası bir null değerin kullanılması mümkün olmayabilir[DisallowNull]
  • CS8608 - Türdeki başvuru türlerinin null olabilme durumu, geçersiz kılınmış üyeyle eşleşmiyor.
  • CS8609 - Dönüş türündeki başvuru türlerinin null atanabilirliği, geçersiz kılınan üye işlevle eşleşmiyor.
  • CS8610 - Tür parametresindeki başvuru türlerinin 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 referans türlerinin null atanabilirliği, örtük olarak uygulanmış ü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 şekilde uygulanan üyeye uymuyor.
  • CS8615 - Türün referans türlerinin null atanabilirliği, uygulanan üyeyle uyuşmuyor.
  • CS8616 - Dönüş türündeki başvuru türlerinin null atanabilirliği, uygulanan üyeyle eşleşmiyor.
  • CS8617 - Parametre türündeki referans türlerinin null atanabilirliği, uygulanan üyeninkilerle uyuşmuyor.
  • CS8618 - Null değer almayan değişken oluşturucudan çıkış yaparken null olmayan bir değer içermelidir. Null olarak bildirmeyi düşünün.
  • CS8619 - Değerdeki başvuru türlerinin null olabilmesi hedef türle eşleşmiyor.
  • CS8620 - Bağımsız değişken, başvuru türlerinin null atanabilirlik farklılıkları nedeniyle parametre olarak kullanılamaz.
  • CS8621 - Hedef temsilci ile dönüş türündeki başvuru türlerinin null atanabilirliği eşleşmiyor (büyük olasılıkla null atanabilirlik öznitelikleri nedeniyle).
  • CS8622 - Parametre türündeki başvuru türlerinin null'lanabilirliği hedef temsilciyle uyumlu değil (büyük olasılıkla null'lanabilirlik öznitelikleri nedeniyle).
  • CS8623 - System.Runtime.CompilerServices.NullableAttribute açık uygulamasına izin verilmez.
  • CS8624 - Argüman, referans türlerinin null değer atanabilirliğindeki farklılıklar nedeniyle çıkış olarak kullanılamaz.
  • CS8625 - Null değeri null ataması yapılamaz başvuru türüne dönüştürülemez.
  • CS8628 - Nesne oluşturma işleminde null atanabilir başvuru türü kullanılamaz.
  • 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.
  • CS8632 - Boş atanabilir referans türleri için ek açıklama yalnızca #nullable ek açıklamalar bağlamındaki kodda kullanılmalıdır.
  • 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.
  • CS8636 - /nullableiçin geçersiz seçenek ; disable, enable, warnings veya annotations olmalıdır
  • CS8637 - Beklenen enable, disableveya restore
  • CS8639 - Türü işleci null başvuru tipi üzerinde kullanılamaz
  • 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 üyesini uygulamaz. Temel tür tarafından uygulanan arabirimdeki başvuru türlerinin null atanabilirliği uyuşmuyor.
  • CS8645 - Üye, farklı referans türü null atanabilirliğine sahip bir arabirim listesinde zaten bulunmaktadır.
  • CS8655 - Switch ifadesi bazı boş girişleri işleyemez (tam 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ı, mümkün olan null üyesine örtük olarak başvurur.
  • 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 null atanabilirliği, geçersiz kılınan üyeyle eşleşmiyor (CS8764, büyük olasılıkla null atanabilirlik öznitelikleri nedeniyle).
  • CS8765 - Parametre türünün null yapılabilirliği geçersiz kılınan üyeyle eşleşmiyor (büyük olasılıkla null yapılabilirlik ö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).
  • CS8767 - Parametrenin 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).
  • CS8768 - Dönüş türündeki başvuru türlerinin null atanabilirliği, uygulanan üyeyle eşleşmiyor (muhtemelen null atanabilirlik öznitelikleri yüzünden).
  • 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öntem, uygulanan ya da geçersiz kılınan üye ile eşleşecek bir ek açıklamaya sahip değil.
  • CS8774 - Üyesi çıkış sırasında null olmayan bir değere sahip olmalıdır.
  • CS8776 - Bu öznitelikte üye kullanılamaz.
  • CS8775 - Üyenin çıkış yapılırken null olmayan bir değere sahip olması gerekiyor.
  • CS8777 - Parametresi çıkış sırasında null olmayan bir değere sahip olmalıdır.
  • Kısmi yöntem bildirimindeki dönüş türü başvuru tiplerinin null atanabilirliği ile eşleşmiyor.
  • CS8824 - Parametresi, çıkış sırasında null olmayan bir değere sahip olmalıdır çünkü parametre null değildir.
  • CS8825 - Parametre null olmadığından 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.

Not

Statik analiz, belirli bir senaryoda yöntemlere hangi sırayla erişildiğini ve yöntemin istisna oluşturmadan başarıyla tamamlanıp tamamlanmadığını her zaman belirleyemez. Bu bilinen tuzaklar Bilinen tuzaklar bölümünde açıklanmıştır.

Beş teknikten birini kullanarak neredeyse tüm uyarıları ele alısınız:

  • Null yapılabilir bağlamı yapılandırma.
  • Gerekli null denetimleri ekleme.
  • ? veya ! null atanabilir ek açıklamaların eklenmesi veya kaldırılması.
  • Null semantiği açıklayan öznitelikler ekleme.
  • Değişkenleri doğru başlatma.

Boş değer atanabilir başvuru türlerini kullanmaya yeni başlıyorsanız, кодunuzdaki olası hatalara yönelik uyarılar sağlamak için nasıl çalıştıklarına ve hangi sorunları çözdüklerine dair bir arka plan sunan boş değer atanabilir başvuru türlerine genel bakış kılavuzunu inceleyebilirsiniz. Ayrıca, mevcut bir projede null atanabilir başvuru türlerini etkinleştirme hakkında daha fazla bilgi edinmek için null atanabilir başvuru türlerine geçiş yönergelerini gözden geçirebilirsiniz.

Boş değer atanabilir bağlamı yapılandırma

Aşağıdaki uyarılar, nullable bağlamı doğru ayarlamadığınıza işaret eder:

  • CS8632 - Null atanabilir başvuru türleri için ek açıklama yalnızca #nullable ek açıklamalar bağlamındaki kodda kullanılmalıdır.
  • CS8636 - /nullableiçin geçersiz seçenek ; disable, enable, warnings veya annotations olmalıdır
  • CS8637 - Beklenen enable, disableveya restore

Yanlış ek açıklama söz dizimi

Bu hatalar ve uyarılar, ! veya ? ek açıklamasının kullanımının yanlış olduğunu gösterir.

  • CS8598 - Bu bağlamda gizleme işlecine izin verilmez
  • CS8623 - System.Runtime.CompilerServices.NullableAttribute açık uygulamasına izin verilmez.
  • CS8628 - Nesne oluşturma işleminde null atanabilir başvuru türü kullanılamaz.
  • CS8639 - Typeof operatörü null atanabilir başvuru türünde kullanılamaz

Bildirimdeki ? ek açıklaması, değişkenin null olabileceğini gösterir. Farklı bir çalışma zamanı türünü göstermez. Aşağıdaki bildirimlerin her ikisi de aynı çalışma zamanı türüdür:

string s1 = "a string";
string? s2 = "another string";

?, derleyiciye null değerler beklentisine ilişkin bir ipucudur.

İfadedeki ! ek açıklaması, ifadenin güvenli olduğunu bildiğinizi ve null olmadığı varsayılması gerektiğini gösterir.

  • Kodunuzdaki System.Runtime.CompilerServices.NullableAttribute değil, bu ek açıklamaları kullanmanız gerekir.
  • ?, ek açıklama olup bir tür olmadığından, typeofveya new ifadeleriyle kullanamazsınız.
  • ! işleci bir değişken ifadesine veya yöntem grubuna uygulanamaz.
  • ! işleci, obj.Field!.Method()gibi bir üye erişim işlecinin soluna uygulanamaz.

Null referansın olası çözülmesi

Bu uyarı kümesi, null durumu belki-null olan bir değişkene başvurduğunuzu bildirir. Bu uyarılar şunlardır:

  • CS8602 - Muhtemelen null olan bir başvurunun kullanımı.
  • CS8670 - Nesne veya koleksiyon başlatıcısı, olasılıkla null olan bir üyeyi örtük olarak başvurur.

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
}

Önceki örnekte, uyarının nedeni Containerveya c'in States özelliği için null değere sahip olabilmesidir. Null olabilecek bir koleksiyona yeni durumlar atamak uyarıya neden olur.

Bu uyarıları kaldırmak için, bu değişkenin null durumununot-null olacak şekilde değiştirmek için ona başvurmadan önce 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 referansını çözmeden önce null olmadığını denetleyerek bu uyarıları düzeltebilirsiniz. message parametresine başvurmadan önce null kontrolü ekleyen aşağıdaki örneği göz önünde bulundurun:

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

Aşağıdaki örnek, States için destek depolamayı başlatır ve set erişim yöntemini kaldırır. Sınıfın kullanıcıları 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, statik analizin message'in nullolabileceğini belirlediği için, message.Length özelliğini yazarken null referans alıyor olabileceğiniz konusunda uyarır. IsNotNull null denetimi sağladığını biliyorsunuz ve truedöndürdüğünde, message'ün null durumu şekilde null olmamalıdır. Derleyiciye bu gerçekleri anlatmalısınız. Bunun bir yolu null forgiving işlecini !kullanmaktır. WriteLine ifadesini aşağıdaki kodla uyacak şekilde değiştirebilirsiniz.

Console.WriteLine(message!.Length);

Null forgiving işleci, uygulanmamış olsaydı belki-null olabilecek ifadeyi not-null yapar. Bu örnekte, imzasına bir öznitelik eklemek daha iyi bir çözümdür IsNotNull:

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

derleyiciye, yöntem döndüğünde parametresi için kullanılan bağımsız değişkenin null olmadığını bildirir. Yöntem false döndüğünde, bağımsız değişkenin, yöntem çağrılmadan önce sahip olduğu null-durum değişmez.

İpucu

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

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

  • Eksik null kontrolü ekleyin.
  • Derleyicinin null durum statik çözümlemesini etkilemek için API'lere null çözümleme öznitelikleri ekleyin. Bu öznitelikler, yöntemi çağırdıktan sonra bir dönüş değeri veya bağımsız değişkeninin belki-null veya not-null olup olmayacağı hakkında derleyiciye bilgi verir.
  • null forgiving işleci !'ı, durumu null olmayan olmasını zorlayan ifadeye 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 - Atılan değer 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 referans ataması.
  • CS8603 - Olası null referans 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ğer, null kabul etmeyen referans türüne dönüştürülemez.
  • CS8629 - Null değer türü null olabilir.

Derleyici, null olamaz 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, kutudan çıkarma ataması, dönüş ifadeleri, yöntemlere yönelik bağımsız değişkenler ve throw ifadeleri 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çıklamasını eklemektir. Bu değişiklik başka uyarılara neden olabilir. Bir değişkeni null atanamaz referanstan null atanabilir referansa değiştirmek, varsayılan null durumunu null olmayandan muhtemelen null olarak değiştirir. Derleyicinin statik analizi, belki-nullolan bir değişkene başvurduğunuz örnekleri bulur.

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 eklersiniz. 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)!;

Belki-null bir ifadeyi null olmayan bir değişkene atama uyarısını gidermek şu dört teknikten biri ile mümkündür:

  • Atamanın sol tarafını null değeri alabilen bir türe değiştirin. Bu eylem, o değişkenin referansını çözdüğünüzde yeni uyarılar oluşturabilir.
  • Atamadan önce null denetimi sağlayın.
  • Atamanın sağ tarafını üreten API'ye açıklama ekle.
  • Null forgiving işlecini atamanın sağ tarafına ekleyin.

Boş olamayan başvuru initialize edilmedi

Bu uyarılar kümesi, türü null atanamayan bir değişkene, null durumu belki null olan bir ifade atadığınızı belirtir. 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;
}

Bir başka alternatif, bu üyeleri null değer atanabilir başvuru türlerine dönüştürmektir. Eğer null ad için izin veriliyorsa, Person sınıfı aşağıdaki gibi tanımlanabilir:

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

Mevcut kod bazen derleyiciyi bu üyeler için null semantiği hakkında bilgilendirmek için başka değişiklikler gerektirir. Birden çok oluşturucuya sahip olabilir ve sınıfınızın bir veya daha fazla üyeyi başlatan özel bir yardımcı yöntemi vardır. 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 System.Diagnostics.CodeAnalysis.MemberNotNullAttribute ve System.Diagnostics.CodeAnalysis.MemberNotNullWhenAttribute özniteliklerini kullanabilirsiniz. Bu öznitelikler, derleyiciye bir üyenin yöntem döndükten sonra null olmayan olduğunu bildirir. Aşağıdaki kodda her birinin bir örneği gösterilmektedir. Person sınıfı, diğer tüm oluşturucular tarafından çağrılan ortak bir oluşturucu kullanır. Student sınıfının System.Diagnostics.CodeAnalysis.MemberNotNullAttribute özniteliğiyle ek açıklamalı bir yardımcı yöntemi vardır.


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 affedici 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 null! olarak 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 tespit etmez. 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 yapılabilir türler olacak şekilde değiştirin.
  • Hangi üyelerin atandığı belirtmek için yardımcı yöntemlere açıklama ekleyin.
  • Başka bir kodda elemanın 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 - Tipteki başvuru türlerinin null atanabilirliği, geçersiz kılınan üyeyle uyuşmuyor.
  • CS8609 - Dönüş türündeki başvuru türlerinin null atanabilirliği geçersiz kılınan üyenin null atanabilirliğiyle eşleşmiyor.
  • Tip parametresindeki başvuru türlerinin null kılabilirliği - geçersiz kılınan üyeyle eşleşmiyor, CS8610.
  • 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 üyenin null atanabilirliğiyle uyuşmuyor.
  • 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ürünün null olabilme durumu örtük olarak uygulanan üyeyle eşleşmiyor.
  • CS8615 - Türdeki başvuru türlerinin null atanabilirliği, uygulanan üyeyle eşleşmiyor.
  • CS8616 - Dönüş türündeki başvuru türünün boş atanabilirliği, uygulanan üyeyle eşleşmiyor.
  • CS8617 - Parametre türündeki başvuru türlerinin null olabilirliği, uygulanan üyeyle uyumlu değil.
  • CS8619 - Değer bağlamındaki başvuru türlerinin null atanabilirliği hedef türle eşleşmiyor.
  • Cs8620 - Bağımsız değişken, başvuru türlerinin null atanabilirliği farklılıkları nedeniyle parametre için kullanılamaz.
  • CS8621 - Dönüş türünün başvuru türlerinin 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 kullanılabilirliği, hedef delegeyle eşleşmiyor (büyük olasılıkla null kullanılabilirlik öznitelikleri nedeniyle).
  • CS8624 - Bağımsız Değişken, referans türlerinin null atanabilirlik farkları 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 bir tür veya yöntem içinde tür parametresi olarak kullanılamaz. Tür bağımsız değişkeninin null değer atanabilirliği 'sınıf' kısıtlamasıyla 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 üyelerini uygulamıyor. Temel tür tarafından uygulanan arabirimdeki başvuru türlerinin null atanabilirliği eşleşmiyor.
  • CS8645 - Üye, referans türlerinin farklı null atanabilirliğine sahip bir interface 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.
  • CS8764 - Dönüş türünün boş değer atanabilirliği, üst sınıf üyesiyle uyuşmuyor (muhtemelen boş değer atanabilirlik öznitelikleri nedeniyle).
  • CS8765 - Parametre türünün null atanabilirliği, geçersiz kılınan üyeyle eşleşmiyor (muhtemelen 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).
  • CS8767 - Parametrenin 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).
  • CS8768 - Dönüş tipindeki başvuru tiplerinin null atanabilirliği, uygulanan üyeyle eşleşmiyor (muhtemelen null atanabilirlik öznitelikleri nedeniyle).
  • CS8769 - Parametre türündeki referans türlerinin null atanabilirliği uygulanan üyeyle eşleşmiyor (büyük olasılıkla null atanabilirlik öznitelikleri nedeniyle).
  • CS8819 - Dönüş türündeki başvuru türlerinin null olabilirliğ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 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 var. Veya bir temsilci türü ve bu temsilcinin ifadesi farklıdır. Tür parametresi ve tür bağımsız değişkeni null olabilme durumu açısından farklıdır.

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

Kod öznitelik bildirimiyle eşleşmiyor

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

  • CS8607 - [NotNull] veya [DisallowNull] ile işaretlenmiş bir tür için muhtemel bir null değer kullanılmamalıdır
  • CS8763 - İşaretlenen [DoesNotReturn] bir yöntem döndürülmemelidir.
  • CS8770 - Yöntem, uygulanan veya geçersiz kılınan üyeyle eşleşmesi için gerekli olan [DoesNotReturn] ek açıklamaya sahip değil.
  • 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 - Üye 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.
  • CS8825 - Parametre null olmadığından 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;

}

Derleyici, message parametresi nullatandığı ve yöntem true döndüğü için bir uyarı üretir. NotNullWhen özniteliği bunun olmaması gerektiğini gösterir.

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

Kapsamlı switch ifadesi

Geçiş ifadeleri tükenmez olmalıdır, yani tüm giriş değerleri ele alınmalıdır. Null değer atanamayan başvuru türleri için bile null değeri hesaba katılmalıdır. 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 string değil, string? şeklindedir. Derleyici yine de bu uyarıyı oluşturur. Desen { } null olmayan tüm değerleri işler, ancak null ile eşleşmiyor. Bu hataları gidermek için, açıkça belirtilmiş bir null durumu ekleyebilir veya { } öğesini _ (atma) deseni ile değiştirebilirsiniz. Atma deseni, diğer tüm değerlere ek olarak null ile eşleşir.