Aracılığıyla paylaş


Derleyici Hatası CS0236

Alan başlatıcı statik olmayan alana, yönteme veya 'name' özelliğine başvuramaz.

Örnek alanları, bir yöntemin dışındaki diğer örnek alanlarını başlatmak için kullanılamaz.

Bu hatanın oluşmasının nedeni

C# dilinde nesne başlatmanın çalışma biçimi nedeniyle derleyici bu kısıtlamayı uygular. Bir nesne oluşturulduğunda, herhangi bir oluşturucu kodu çalıştırilmeden önce alan başlatıcıları işlenir. Bu aşamada:

  1. Alan bağımlılığı kısıtlaması: Alan başlatıcılar tek bir dosya içinde sözcük düzeninde işlenirken, kural sınıf yazarlarının derleyici hataları eklemeden alanları yeniden düzenlemesine olanak sağlamak için alanlar arasındaki bağımlılıkları engeller. Kısmi sınıflar için farklı kaynak dosyalar arasında alan başlatıcılarının sırası belirtilmez.

  2. Nesne tam olarak yapılandırılmadı: Alan başlatıcılar çalıştığında, nesne örneği tamamlanmamış durumda olur. Bu aşamada alanlar arasında referanslara izin vermek başlatılmamış belleğe veya öngörülemeyen davranışlara erişmeye neden olabilir.

  3. Derleyici güvenliği: Bu kısıtlama olası çalışma zamanı hatalarını önler ve öngörülebilir nesne oluşturma davranışı sağlar.

Derleyici, derleme sırasında bu düzeni algılar ve bu olası sorunları önlemek için CS0236'yi raporlar.

Bu hatayı düzeltmek için

  1. Başlatmayı oluşturucuya taşıma: Başlatmayı, tüm alanların kullanılabilir olması garanti edilen bir örnek oluşturucusunun içinde gerçekleştirin.

  2. Statik alanları kullan: Başvuruda bulunılan alanın örneğe özgü olması gerekmiyorsa, bunu statik hale getirebilirsiniz.

  3. Varsayılan değerleri kullan: Diğer örnek üyelerine başvurmadan değişmez değerlerle veya ifadelerle alanları başlatın.

  4. Gecikmeli başlatma: Diğer örnek üyelerine bağlı karmaşık başlatma mantığı için yedekleme alanlarıyla özellikleri kullanın.

Örnek

Aşağıdaki örnek CS0236 hatasını oluşturur ve nasıl düzeltileceğini gösterir:

public class MyClass
{
    public int i = 5;

    // CS0236: Field initializer cannot reference instance field 'i'
    // This restriction allows class authors to rearrange fields without compiler errors
    public int j = i;  // CS0236

    public MyClass()
    {
        // This works because both fields are guaranteed to be initialized
        // before constructor code runs
        j = i;
    }
}

Ek örnekler

Aşağıdaki örneklerde CS0236'nın gerçekleştiği farklı senaryolar gösterilmektedir:

public class Examples
{
    private string name = "Default";
    
    // CS0236: Cannot reference instance field in initializer
    private string displayName = name.ToUpper();
    
    // CS0236: Cannot reference instance method in initializer  
    private int length = GetNameLength();
    
    // CS0236: Cannot reference instance property in initializer
    private string formatted = FormattedName;
    
    public string FormattedName => $"Name: {name}";
    
    private int GetNameLength() => name.Length;
    
    public Examples()
    {
        // All of these work in the constructor:
        displayName = name.ToUpper();
        length = GetNameLength();
        formatted = FormattedName;
    }
}