Başvuru parametreleri, değişkenler ve dönüşlerle ilişkili hatalar ve uyarılar

Başvuru değişkenleriyle çalışırken aşağıdaki hatalar oluşturulabilir:

  • CS0192: Bir alan, readonly değeri olarak ref veya out kullanılamaz (oluşturucu dışında)
  • CS0199: Alan static readonly veya refout değeri olarak kullanılamaz (statik oluşturucu dışında)
  • CS0206: Ref döndürmeyen bir özellik veya dizin oluşturucu, out ya da ref değeri olarak kullanılamaz
  • CS0631: ref ve out bu bağlamda geçerli değildir
  • CS0767: Belirtilen tür parametrelerine sahip arabirim devralınamıyor çünkü bu, yöntemin yalnızca ref ve out bakımından farklı olan aşırı yüklemeler içermesine neden oluyor
  • CS1510: A ref veya out değeri atanabilir bir değişken olmalıdır
  • CS1605: Salt okunur olduğundan değişken, ref veya out değeri olarak kullanılamaz
  • CS1623: Yineleyiciler ref, in veya out parametrelerine sahip olamaz
  • CS1649: Bir readonly alanının üyeleri, ref veya out değeri olarak kullanılamaz (oluşturucu dışında)
  • CS1651: static readonly alanın alanları, ref veya out değeri olarak kullanılamaz (static oluşturucu dışında)
  • CS1655: ref veya out değeri olarak bu türdeki alanlar kullanılamaz
  • CS1657: Değişken veya ref değeri olarak out kullanılamaz
  • CS1741: Bir ref veya out parametresi varsayılan değere sahip olamaz
  • CS1939: Aralık değişkeni veya outref parametresi olarak geçirilemiyor
  • CS1988: Zaman uyumsuz yöntemlerin ref, in veya out parametreleri olamaz
  • CS7084: Windows Çalışma Zamanı olayı, out veya ref parametresi olarak geçirilemeyebilir.
  • CS8196: Örtük olarak yazılan bir değişkene başvuruya aynı bağımsız değişken listesinde izin verilmez.
  • CS8325: 'await' koşullu işleç içeren bir ref ifadede kullanılamaz
  • CS8326: Her iki koşullu işleç değeri de başvuru değeri olmalıdır veya ikisi de başvuru değeri olmayabilir
  • CS8327: İfadenin alternatif başvuru değeriyle eşleşmesi için doğru türde olması gerekir
  • CS8329: Değişken, salt okunur bir değişken olduğundan ref veya out değeri olarak kullanılamaz
  • CS8330: Değişkenin üyeleri, salt okunur bir değişken olduğundan ref veya out değeri olarak kullanılamaz
  • CS8331: Salt okunur bir değişken olduğundan, bu değişkene atama yapılamaz veya bir ref atamasının sağ tarafında kullanılamaz
  • CS8332: Yalnızca okunur bir değişken olduğundan, bir değişkenin üyesine atama yapılamaz veya ref atamasının sağ tarafı olarak kullanılamaz
  • CS8337: 'ref' uzantı yönteminin ilk parametresi bir değer türü veya yapıyla kısıtlanmış genel bir tür olmalıdır.
  • CS8338: Uzantı yönteminin ilk 'in' veya 'ref readonly' parametresi somut (genel olmayan) bir değer türü olmalıdır.
  • CS8373: Bir ref atamanın sol tarafı bir ref değişkeni olmalıdır.
  • CS8388: Bir değişken, out başvuru yerel değişkeni olarak bildirilemez
  • CS8977: 'UnmanagedCallersOnly' özniteliğiyle işaretlenmiş bir yöntemin imzasında 'ref', 'in' veya 'out' kullanılamaz.
  • CS8986: Parametrenin 'kapsamlı' değiştiricisi hedefle eşleşmiyor.
  • CS8987: Parametrenin 'scoped' değiştiricisi, geçersiz kılınan veya uygulanan üyeyle uyuşmuyor.
  • CS9061: 'kapsamlı' değiştirici atma ile kullanılamaz.
  • CS9062: Türler ve diğer adlar 'scoped' olarak adlandırılamaz.
  • CS9063: UnscopedRefAttribute, varsayılan olarak kapsamı kaldırıldığı için bu parametreye uygulanamaz.
  • CS9065: 'System.Runtime.CompilerServices.ScopedRefAttribute' kullanmayın. Bunun yerine 'scoped' anahtar sözcüğünü kullanın.
  • CS9066: UnscopedRefAttribute, 'kapsamlı' değiştiricisi olan parametrelere uygulanamaz.
  • CS9072: Bir derleme değişkeni, yerel başvuru olarak bildirilemez
  • CS9101: UnscopedRefAttribute yalnızca yapı veya sanal arabirim örneği yöntemlerine ve özelliklerine uygulanabilir ve oluşturuculara veya yalnızca yerleşik üyelere uygulanamaz.
  • CS9102: Uygulanan üyenin bu özniteliği olmadığından UnscopedRefAttribute bir arabirim uygulamasına uygulanamaz.
  • CS9104: using türündeki bir deyim kaynağı async yöntemlerde veya async lambda ifadelerinde kullanılamaz.
  • CS9190: readonly değiştirici sonra refbelirtilmelidir.
  • CS9199: Bir ref readonly parametre out özniteliğine sahip olamaz.

Başvuru değişkenleri yanlış kullanıldığında aşağıdaki uyarılar oluşturulur:

  • CS9073: Parametrenin 'kapsamlı' değiştiricisi hedefle eşleşmiyor.
  • CS9074: Parametrenin 'kapsamlı' değiştiricisi geçersiz kılınan veya uygulanan üyeyle eşleşmiyor.
  • CS9191: in parametresine karşılık gelen bağımsız değişken için kullanılan ref değiştiricisi, in ile eşdeğerdir. Bunun yerine in kullanmayı göz önünde bulundurun.
  • CS9192: Bağımsız değişken, ref ya da in anahtar sözcüğüyle geçirilmelidir.
  • CS9193: Argüman, ref readonly parametresine geçirildiği için bir değişken olmalıdır
  • CS9195: Bağımsız değişken in anahtar sözcüğüyle geçirilmelidir
  • CS9196: Parametrenin başvuru türü değiştiricisi geçersiz kılınmış veya uygulanan üyede karşılık gelen parametreyle eşleşmiyor.
  • CS9197: Parametrenin başvuru türü değiştiricisi, gizli üyedeki ilgili parametreyle eşleşmiyor.
  • CS9198: Parametrenin başvuru türü değiştiricisi hedefteki ilgili parametreyle eşleşmiyor.
  • CS9200: Parametre için ref readonly varsayılan bir değer belirtilir, ancak ref readonly yalnızca başvurular için kullanılmalıdır. parametresini olarak inbildirmeyi göz önünde bulundurun.
  • CS9201: Ref alanı, kullanılmadan önce ref olarak atanmalıdır.
  • CS9265: Alana hiçbir zaman ref ataması yapılmaz ve her zaman varsayılan değerine (null başvuru) sahip olacaktır

Bu hatalar ve uyarılar şu temalara uyar:

Bu makalede, in, ref readonly, ref veya out değiştiricilerinden biriyle bildirilen bir parametre, ref yerel değişken, ref struct içindeki bir ref alanı veya ref dönüş değeri için genel bir terim olarak referans değişkeni kullanılır. Bir referans değişkeni, referent adı verilen başka bir değişkene işaret eder.

Hatalı söz dizimi

Bu hatalar, başvuru değişkenleriyle ilgili yanlış söz dizimi kullandığınızı gösterir:

  • CS8373: Atamanın ref sol tarafı bir ref değişkeni olmalıdır.
  • CS8388: Bir out değişken, ref yerel değişken olarak bildirilemez.
  • CS9190: readonly değiştirici sonra refbelirtilmelidir.

Bu hataları düzeltmek için:

  • Bir = ref işlecin sol işleneninin bir değer ifade veya başvuru olmayan yerel değişken yerine bir başvuru değişkeni olduğundan emin olun. Ref ataması, her iki tarafın da aynı depolama konumuna (CS8373) bir alias oluşturabilen ref değişkenleri olmasını gerektirir.
  • Başvuru parametrelerini bildirirken, değiştiriciyi ref readonly yerine readonly ref olarak yazın. C# dil belirtimi, tüm başvuru parametre türlerinde tutarlı bir söz dizimini korumak için, parametre bildirimlerinde ref değiştiricisinden önce readonly anahtar sözcüğünün bulunmasını gerektirir (CS9190).
  • ref Yerel başvuru değişkenlerini bildirirken yerine out anahtar sözcüğünü kullanın. out yalnızca bir yöntemin döndürmeden önce bir değer ataması gerektiğini belirten bir parametre değiştiricidir, ancak ref diğer depolama konumlarını (CS8388) diğer adla kullanan yerel değişkenler oluşturmak için uygun anahtar sözcüktür. Başvuru değişkenleri ve söz dizimi gereksinimleri hakkında daha fazla bilgi için bkz. başvuru değişkenleri ve C# Dil Belirtimi.

Başvuru değişkeni kısıtlamaları

Aşağıdaki hatalar, bir referans değişkeninin gerekli olduğu yerde kullanılamayacağını gösterir:

  • CS0631: ref ve out bu bağlamda geçerli değildir
  • CS0767: Belirtilen tür parametrelerine sahip arabirim devralınamaz; çünkü bu, yöntemin yalnızca ref ve out açısından farklı olan aşırı yüklemeler içermesine neden olur
  • CS1623: Yineleyicilerde ref, in veya out parametreleri olamaz
  • CS1741: Bir ref veya out parametresi varsayılan değere sahip olamaz
  • CS1939: Aralık değişkeni veya outref parametresi olarak geçirilemiyor
  • CS1988: Zaman uyumsuz yöntemler ref, in veya out parametrelerine sahip olamaz
  • CS7084: Bir Windows Çalışma Zamanı olayı, out veya ref parametresi olarak geçirilemez.
  • CS8196: Örtük olarak türü belirlenmiş out bir değişkene başvuruya aynı bağımsız değişken listesinde izin verilmez.
  • CS8325: 'await' koşullu işleç içeren bir ref ifadede kullanılamaz
  • CS8326: Her iki koşullu işleç değeri de başvuru değeri olmalıdır veya ikisi de başvuru değeri olmayabilir
  • CS8327: İfadenin alternatif başvuru değeriyle eşleşmesi için doğru türde olması gerekir
  • CS8337: 'ref' uzantı yönteminin ilk parametresi bir değer türü veya yapıyla kısıtlanmış genel bir tür olmalıdır.
  • CS8338: Uzantı yönteminin ilk 'in' veya 'ref readonly' parametresi somut (genel olmayan) bir değer türü olmalıdır.
  • CS8977: 'UnmanagedCallersOnly' özniteliği uygulanan bir yöntemin imzasında 'ref', 'in' veya 'out' kullanılamaz.
  • CS9072: Bir yapıbozma değişkeni, ref yerel değişken olarak bildirilemez
  • CS9104: using türündeki bir ifade kaynağı, async yöntemlerde veya async lambda ifadelerinde kullanılamaz.
  • CS9199: Bir ref readonly parametre out özniteliğine sahip olamaz.

Aşağıdaki uyarılar bir başvuru değişkeninin kullanılmaması gerektiğini ve güvenli olmayabileceğini gösterir:

  • CS9196: Parametrenin başvuru türü değiştiricisi geçersiz kılınmış veya uygulanan üyede karşılık gelen parametreyle eşleşmiyor.
  • CS9197: Parametrenin başvuru türü değiştiricisi, gizli üyedeki ilgili parametreyle eşleşmiyor.
  • CS9198: Parametrenin başvuru türü değiştiricisi hedefteki ilgili parametreyle eşleşmiyor.
  • CS9200: Parametre için ref readonly varsayılan bir değer belirtilir, ancak ref readonly yalnızca başvurular için kullanılmalıdır. parametresini olarak inbildirmeyi göz önünde bulundurun.
  • CS9201: Ref alanına, kullanılmadan önce ref ataması yapılmış olmalıdır.
  • CS9265: Alana hiçbir zaman ref ataması yapılmaz ve alan her zaman varsayılan değeri olan (null başvuru) olarak kalır

Bu hataları düzeltmek için:

  • Dizin oluşturuculardan başvuru parametrelerini kaldırın. İndeksleyiciler, dizi benzeri erişim söz dizimi sağlamak için tasarlanmıştır ve derleyici, indeksleyici erişimcileri (CS0631, CS1623) aracılığıyla aktarılan referansların güvenli yaşam süresini izlemeyi garanti edemez.
  • Yineleyici yöntemlerinden başvuru parametrelerini kaldırın. Yineleyiciler, durum makinelerini kullanarak birden çok çağrıda kodu gizli olarak yürütür ve derleyici, yürütmenin askıya alındığı ve sürdürüldüğü verim dönüş sınırları boyunca başvuruda bulunılan değişkenlerin geçerli kalmasını sağlayamaz (CS1623).
  • Asenkron yöntemlerden başvuru parametrelerini kaldırın. Zaman uyumsuz yöntemler, bekleme noktalarında yürütmeyi askıya alabilir ve farklı iş parçacıklarında sürdürebilir, bu da başvuruda bulunılan değişkenlerin yöntemin yürütülmesi (CS1988) boyunca geçerli ve erişilebilir kalmasını garanti etmek mümkün değildir.
  • Await ifadelerini ref koşullu ifadeler içinde kullanmaktan kaçının. Await işlemi, koşullu operatör aracılığıyla seçilen referansları geçersiz kılarak işlemin yürütülmesini askıya alabilir ve yürütme devam ettiğinde geçersiz kılınmış referansların olası kullanımına neden olabilir (CS8325).
  • Ref koşullu operatörün her iki dalının da referans döndürdüğünden veya hiçbirinin de referans döndürmediğinden ve her ikisi de referans olduğunda aynı türde olmaları gerektiğinden emin olun. Koşullu işleç, hangi dal seçildiğinden bağımsız olarak çağıran kod tarafından güvenli bir şekilde kullanılabilecek tutarlı bir sonuç türü üretmelidir (CS8326, CS8327).
  • ref ve out parametrelerinden varsayılan değerleri kaldırın. Parametre ile var olan bir değişken arasında gerekli diğer ad ilişkisini kurmak ve varsayılan değerleri anlamsal olarak anlamsız hale getirmek için başvuru parametreleri her zaman çağrı sitesinde sağlanmalıdır (CS1741).
  • Aynı değişkene de başvuran bağımsız değişken listesinde örtük olarak yazılan out bir değişken bildirmekten kaçının. Derleyici, aynı ifade içindeki değişkenin kullanımlarını eşzamanlı olarak doğrulayarak döngüsel bağımlılık (CS8196) oluştururken değişkenin türünü yöntem imzasından çıkarmalıdır.
  • LINQ sorgu aralığı değişkenlerini başvuru parametresi olarak geçirmeyin. Aralık değişkenleri, ömrü sorgu yürütme modeli tarafından yönetilen ve güvenli bir şekilde başvurulabilen kararlı bellek konumlarına sahip olmayan derleyici tarafından oluşturulan yineleme değişkenleridir (CS1939).
  • Nesneleri oluştururken başvuru yerel değerleri yerine normal değer değişkenlerini kullanın. Yapı bozma, yapı bozulan değerleri almak için yeni değişkenler oluşturur ve referans değişkenleri bu geçici değerleri bağımsız olarak depolamak yerine bu değerlere diğer adlar vermeyi dener (CS9072).
  • Parametrelerdeki ref ve out değiştiricilerine göre farklılık gösteren yöntemlere sahip birden çok arabirimi uygulamaktan kaçının. C# dilinin spesifikasyonu, bunları farklı imzalar olarak ele alır, ancak hem ref hem de out uygulama sınırlarında aynı çağrı söz dizimini paylaştıkları için hangi uygulamanın çağrılacağını ayırt edecek bir yol sağlamaz (CS0767).
  • ile System.Runtime.InteropServices.UnmanagedCallersOnlyAttributedekore edilmiş yöntemlerden başvuru parametrelerini kaldırın. Bu yöntemler, C# başvuru güvenlik kurallarını anlamayan yönetilmeyen koddan çağrılır ve yönetilen/yönetilmeyen sınır (CS8977) genelinde başvurulan değişkenlerin uygun yaşam süresi yönetimini garanti etmez.
  • ref değiştiricisini yalnızca uzantı yönteminin ilk parametrelerinde, değer türleri veya değer türleriyle kısıtlanmış genel türler için kullanın. Başvuru türleri CLR düzeyinde zaten başvuruyla geçmektedir ve ref eklemek, bir başvuruya referans oluşturur; ref ile yapılan değer türü uzantıları ise genişletilmiş örneğin mutasyonunu sağlar (CS8337, CS8338).
  • Windows Çalışma Zamanı olaylarını başvuru parametresi olarak geçirmeyin. Bu olaylar, .NET referanslarından farklı ömür döngüsü ve iş parçacığı yönetimi semantiğine sahip olan ve C# başvuru parametrelerinin (CS7084) gerektirdiği takma adlama davranışını desteklemeyen Windows Çalışma Zamanı tür sistemiyle uyumludur.
  • parametrelerinden System.Runtime.InteropServices.OutAttribute'yı ref readonly kaldırın. Bu öznitelik, parametre yönünün yalnızca giden olduğu platform çağırma senaryolarında semantiği sıralamak için tasarlanmıştır ve bu senaryolar, parametrenin yeniden atanamayacak mevcut verilere başvurduğu garantisiyle (ref readonly) çakışır.
  • Bir türdeki tüm ref alanların, oluşturucu tamamlanmadan önce alan başlatıcılarda veya tüm oluşturucu kod yollarında atandığından emin olun. Başlatılmamış başvuru alanları, erişilirse bellek bozulmasına neden olabilecek geçersiz başvurular içerebilir (CS9201, CS9265).
  • Geçersiz kılınan temel metot veya uygulanan arayüz metot ile bir metot arasındaki başvuru türü değiştiricilerini (ref, in, out, ref readonly) eşleştirin. Referans değiştirici, türetilmiş türlerin yedeklenebilirlik ve çağıranların beklentilerini (CS9196, CS9197, CS9198) korumak için yerine getirmesi gereken yöntem imzası sözleşmesinin bir parçasıdır.
  • Varsayılan değerler sağlıyorsanız parametreleri in yerine ref readonly olarak bildirin. ref readonly , çağıranın var olan bir değişkene başvuru geçirdiği senaryolar için tasarlanmıştır, ancak in parametreler değerlerin hem başvurularını hem de geçici kopyalarını kabul ederek varsayılan değerleri anlamlı hale getirir (CS9200).

Başvuru değişkenlerine nerede izin verileceği hakkında daha fazla bilgi için bkz. Yöntem parametreleri, Yineleyiciler, Zaman Uyumsuz programlama desenleri ve C# Dil Belirtimi.

unscoped ref kısıtlamalar

Bazı konumlarda ref parametrelerindeki unscoped niteleyicisi kullanılamaz:

  • CS9101: UnscopedRefAttribute yalnızca yapı örneğine veya sanal arabirim yöntemlerine ve özelliklerine uygulanabilir ve oluşturuculara veya yalnızca yerleşik üyelere uygulanamaz.
  • CS9102: Uygulanan üyenin bu özniteliği olmadığından UnscopedRefAttribute bir arabirim uygulamasına uygulanamaz.

Bu hataları düzeltmek için:

  • Değiştiriciyi unscoped veya System.Diagnostics.CodeAnalysis.UnscopedRefAttribute özniteliğini yapı oluşturucularından ve yalnızca başlatma üyelerinden kaldırın. Bu üyeler, derleyicinin herhangi bir başvurunun başlatma aşamasını aşmadığından emin olması gereken özel başlatma semantiğine sahiptir ve kapsam dışı başvurulara izin vermek, yapının tam olarak erişilebilir hale gelmesinden önce başlatmanın tamamlanmasının garantisini ihlal eder (CS9101).
  • unscoped karşılık gelen arabirim yöntemine sahip olmadığında, değiştiriciyi arabirim uygulama yöntemlerinden kaldırın. Kapsamsız özellik, yöntemin başvuru ömrü garantileriyle ilgili sözleşmesini etkiler ve uygulamalar, çağıranların hangi uygulamanın çağrıldığından bağımsız olarak tutarlı yaşam süresi davranışına güvenebilmesi için uyguladıkları arabirimle aynı sözleşmeyi sürdürmelidir (CS9102).

Kapsamı belirlenmiş ve kapsamsız başvurular hakkında daha fazla bilgi için bkz. C# dil belirtiminde Yöntem parametreleri ve Güvenli bağlam kısıtlaması .

Referans değişkenleri bir başvuru hedefi gerektirir

Bir referans parametresine, referans dönüş değerine veya ref yerel atamasına bağımsız değişken olarak bir değişken vermeniz gerekir:

  • CS0206: Ref döndürmeyen bir özellik veya dizin oluşturucu, out veya ref değeri olarak kullanılamaz
  • CS1510: A ref veya out değeri atanabilir bir değişken olmalıdır

Uyarı:

  • CS9191: in parametresine karşılık gelen bağımsız değişken için kullanılan ref değiştiricisi, in ile eşdeğerdir. Bunun yerine in kullanmayı göz önünde bulundurun.
  • CS9192: Argüman, ref veya in anahtar sözcüğüyle geçirilmelidir.
  • CS9193: Argüman, bir ref readonly parametresine geçirildiği için değişken olmalıdır
  • CS9195: Bağımsız değişken, in anahtar sözcüğüyle geçirilmelidir

Bu hataları düzeltmek için:

  • Bir özelliğin veya dizin oluşturucu erişiminin sonucunu, bir başvuru parametresi olarak geçirmeden önce yerel değişkende depolayın. Özellikler ve dizin oluşturucular , depolama konumlarına doğrudan erişim sağlamak yerine değer döndüren yöntemlerdir ve başvuru parametreleri diğer adla alınabilen kararlı bir bellek konumuna sahip gerçek bir değişken gerektirir (CS0206, CS1510).
  • Parametrelere bağımsız değişkenler geçirirken in yerine ref değiştiricisini kullanın. ref geriye dönük uyumluluk nedeniyle teknik olarak çalışmasına rağmen, in değiştirici, bağımsız değişkenin salt okunur olduğunu ve kopyalamadan referans olarak daha verimli şekilde iletilebileceğini daha net bir şekilde ifade eder (CS9191, CS9195).
  • Referans bekleyen parametrelere bağımsız değişkenleri geçirirken uygun referans değiştiriciyi (ref, in veya ref readonly) ekleyin. Değiştiricinin atlanması derleyicinin değerin geçici bir kopyasını oluşturmasına neden olabilir; bu verimsizdir ve çağıran kod değişikliklerin özgün değişkene yansıtılması bekleniyorsa beklenmeyen davranışlara yol açabilir (CS9192, CS9193).

Başvuru parametreleri ve başvuruya göre değişkenleri geçirme hakkında daha fazla bilgi için bkz. Yöntem parametreleri, ref anahtar sözcüğü ve C# Dil Belirtimi.

Yazılabilir referans değişkenleri, yazılabilir bir hedef gerektirir

Yazılabilir bir referans değişkeni, başvurulan nesnenin de yazılabilir olmasını gerektirir. Aşağıdaki hatalar değişkenin yazılabilir olmadığını gösterir:

  • CS0192: Bir readonly alan, ref veya out değeri olarak kullanılamaz (yapıcı dışında)
  • CS0199: Alan static readonly veya refout değeri olarak kullanılamaz (statik oluşturucu dışında)
  • CS1605: Değişken, salt okunur olduğundan bir ref veya out değeri olarak kullanılamaz
  • CS1649: Bir readonly alanının üyeleri, ref veya out değeri olarak kullanılamaz (oluşturucu dışında)
  • CS1651: Bir alanın alanları, ref veya out değeri olarak kullanılamaz (static readonly statik bir oluşturucu dışında)
  • CS1655: ref türündeki alanlar, out veya ref değeri olarak kullanılamaz
  • CS1657: Değişken veya ref değeri olarak out kullanılamaz
  • CS8329: Salt okunur bir değişken olduğundan, bir ref veya out değeri olarak kullanılamaz
  • CS8330: Değişkenin üyeleri, salt okunur bir değişken olduğundan bir ref veya out değeri olarak kullanılamaz
  • CS8331: Yalnızca okunur bir değişken olduğundan, bu değişkene atama yapılamaz veya bir ref atamasının sağ tarafında kullanılamaz
  • CS8332: Yalnızca okunur bir değişken olduğundan, bir değişkenin üyesine atama yapılamaz veya ref atamasının sağ tarafı olarak kullanılamaz

Bu hataları düzeltmek için:

  • Salt okunur bir alandaki değeri bir yerel değişkene kopyalayın ve bu yerel değişkeni ref veya out parametresi olarak geçirin. Salt okunur alanlar başlatmadan sonra sabittir (oluşturucular dışında) ve bunlara yazılabilir başvurulara izin vermek, salt okunur olarak sağladığı değişmezlik garantisini ihlal eder (CS0192, CS0199, CS1649, CS1651).
  • ref readonly veya in parametrelerini, salt okunur değişkenleri, yineleme değişkenlerini veya başka yazılamayan değerleri başvuruya göre geçirmeniz gerektiğinde ref veya out parametreleri yerine kullanın. Bu değiştiriciler yöntemin, değiştirme girişiminde bulunmadan yalnızca başvuruda bulunan değeri okuyacağını gösterir. Bu, özgün değişkenin (CS1605, CS1655, CS1657, CS8329) değişmezlik kısıtlamalarıyla uyumlu hale geliyor.
  • Salt okunur olan değişkenlerin üyelerini yazılabilir başvurular olarak iletmeden önce yerel değişkenlere kopyalayın. Üyenin kendisi salt okunur olarak bildirilmese de, salt okunur bir yol üzerinden (salt okunur bir alan, in parametre veya ref readonly yerel) erişilir ve derleyici salt okunur verilerin dolaylı mutasyonunu (CS8330, CS8332) önlemek için salt okunurluğun geçişini zorlar.
  • Salt okunur değişkenlere, foreach döngüsü değişkenlerine, using ifadesi kaynaklarına veya fixed ifadesi değişkenlerine yazılabilir başvuru atamalarından kaçının. Bu değişkenler, derleyici tarafından yönetilen özel yaşam süresi semantiğine sahiptir. Değişken, kapsamının sonunda otomatik olarak tamamlanır veya yok edilir. Dış referanslar, elden çıkarmadan sonra sarkan referanslar oluşturur (CS8331).

Salt okunur semantikler ve başvuru parametreleri hakkında daha fazla bilgi için bkz. readonly anahtar sözcüğü, in parametre değiştiricisi, ref readonly ve C# Dil Belirtimi.