Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
C# derleyicisinin her sürümünde yeni uyarılar ve hatalar ortaya çıkarılabilir. Mevcut kodda yeni uyarılar bildirilebildiğinde, bu uyarılar uyarı dalgası olarak adlandırılan bir kabul etme sistemi altında kullanıma sunulmuştur. Kabul etme sistemi, mevcut kodda etkinleştirmek için eylem gerçekleştirmeden yeni uyarılar görmemeniz gerektiği anlamına gelir. Belirtildiğinde <TreatWarningsAsErrors>true</TreatWarningsAsErrors> , etkin uyarı dalgası uyarıları hata oluşturur. C# 9'a uyarı dalgası 5 tanılamaları eklendi. C# 10'da Uyarı Dalgası 6 tanılama eklendi. C# 11'e uyarı dalgası 7 teşhisleri eklendi. C# 12 sürümüne Uyarı Dalgası 8 tanılamaları eklendi. C# 13'te uyarı dalgası 9 tanılaması eklendi. C# 14'te Uyarı Dalgası 10 için tanılama eklendi.
.NET 7 SDK'sı (C# 11) ile başlayan derleme sistemi uyarı dalgalarını aşağıdaki kurallarla ayarlar:
- AnalysisLevel belirtilmezse geçerli TFM'yi izler
- TFM şu anda 'en güncel' TFM ise AnalysisLevel en güncel olarak ayarlanır (yükseltmemiz gereken bir özellik tarafından tanımlandığı şekilde)
- Belirtilmezse WarningLevel geçerli TFM'yi izlemelidir
- WarningLevel kullanıcı tarafından sağlanan değeri geçersiz kılmamalıdır
- Proje bir .NET Framework projesiyse WarningLevel değeri 4 olarak ayarlanmalıdır
.NET 7'den önceki SDK'lar için AnalysisLevel her zaman WarningLevel'i yok sayar.
CS9265 - Alan hiçbir zaman referans olarak atanmayacak ve her zaman varsayılan değerine sahip olacaktır.
Uyarı dalgası 10
Hiçbir zaman ref başvur atanmamış bir ref struct alanının varsayılan değeri her zaman null başvurudur. Aşağıdaki kod CS9265 üretir:
ref struct Container
{
// CS9265: Field 'value' is never ref-assigned to,
// and will always have its default value (null reference)
public ref int value;
}
Bu uyarıyı gidermek için, alanı bir alan başlatıcıda veya tüm oluşturucu kod yollarında yeniden atayın. Alternatif olarak, alanın bir başvuru olması gerekmiyorsa alan bildiriminden değiştiriciyi kaldırın ref .
CS9123 - '&' işleci zaman uyumsuz yöntemlerdeki parametrelerde veya yerel değişkenlerde kullanılmamalıdır
Uyarı dalgası 8
Async yöntemlerdeki parametreler veya yerel değişkenler üzerinde & işleci kullanılmamalıdır.
Aşağıdaki kod CS9123 oluşturur:
public static async Task LogValue()
{
int x = 1;
unsafe {
int* y = &x;
Console.WriteLine(*y);
}
await Task.Delay(1000);
}
CS8981 - Tür adı yalnızca küçük harfli ascii karakterler içerir. Bu tür adlar dilde rezerve edilebilir.
Uyarı dalgası 7
C# için eklenen tüm yeni anahtar sözcüklerin tümü küçük harf ASCII karakterleri olacaktır. Bu uyarı, türlerinizin hiçbirinin gelecekteki anahtar sözcüklerle çakışmamasını sağlar. Aşağıdaki kod CS8981 üretir:
public class lowercasename
{
}
Türü, en az bir büyük harf, basamak veya alt çizgi gibi küçük harf olmayan bir ASCII karakteri içerecek şekilde yeniden adlandırarak bu uyarıyı giderebilirsiniz.
CS8826 - Kısmi yöntem bildirimlerinin imza farklılıkları vardır.
Uyarı dalgası 6
Bu uyarı, kısmi yöntem imzaları arasındaki farkları raporlamadaki bazı tutarsızlıkları düzeltir. Kısmi yöntem imzaları farklı CLR imzaları oluşturduğunda derleyici her zaman bir hata bildirdi. İmzalar sözdizimsel olarak farklı olduğunda derleyici şimdi CS8826'yı bildirir. Aşağıdaki kısmi sınıfı göz önünde bulundurun:
public partial class PartialType
{
public partial void M1(int x);
public partial T M2<T>(string s) where T : struct;
public partial void M3(string s);
public partial void M4(object o);
public partial void M5(dynamic o);
public partial void M6(string? s);
}
Aşağıdaki kısmi sınıf uygulaması birkaç CS8626 örneği oluşturur:
public partial class PartialType
{
// Different parameter names:
public partial void M1(int y) { }
// Different type parameter names:
public partial TResult M2<TResult>(string s) where TResult : struct => default;
// Relaxed nullability
public partial void M3(string? s) { }
// Mixing object and dynamic
public partial void M4(dynamic o) { }
// Mixing object and dynamic
public partial void M5(object o) { }
// Note: This generates CS8611 (nullability mismatch) not CS8826
public partial void M6(string s) { }
}
Not
Bir yöntemi gerçekleştirirken, diğer bildirimin null atanabilir başvuru türlerini kabul ettiği durumlarda null atanamaz bir başvuru türü kullanılıyorsa, CS8826 yerine CS8611 hatası oluşturulur.
Bu uyarıların herhangi bir örneğini düzeltmek için iki imzanın eşleştiğinden emin olun.
CS7023 - 'is' veya 'as' işlecinin ikinci işleneni statik türde olmayabilir
Uyarı dalgası 5
is ve as ifadeleri, statik bir türün örneklerini oluşturamadığınız için her zaman statik bir tür için false döndürür. Aşağıdaki kod CS7023 oluşturur:
static class StaticClass
{
public static void Thing() { }
}
void M(object o)
{
// warning: cannot use a static type in 'is' or 'as'
if (o is StaticClass)
{
Console.WriteLine("Can't happen");
}
else
{
Console.WriteLine("o is not an instance of a static class");
}
}
Tür testi hiçbir zaman başarılı olamadığından derleyici bu uyarıyı bildirir. Bu uyarıyı düzeltmek için testi kaldırın ve yalnızca test başarılı olursa yürütülen tüm kodları kaldırın. Yukarıdaki örnekte yan else tümcesi her zaman yürütülür. Bu yöntem gövdesini şu tek satırla değiştirebilirsiniz:
Console.WriteLine("o is not an instance of a static class");
CS8073 - 'type' türündeki bir değer hiçbir zaman 'type' türündeki 'null' değerine eşit olmadığından ifadenin sonucu her zaman 'değer'dir
Uyarı dalgası 5
"== ve != işleçleri, bir struct türü örneğini null ile karşılaştırırken her zaman false (veya true) döndürür." Aşağıdaki kodda bu uyarı gösterilmektedir.
S ve struct ile operator == ve operator != tanımlayan bir struct olduğunu varsayalım:
class Program
{
public static void M(S s)
{
if (s == null) { } // CS8073: The result of the expression is always 'false'
if (s != null) { } // CS8073: The result of the expression is always 'true'
}
}
struct S
{
public static bool operator ==(S s1, S s2) => s1.Equals(s2);
public static bool operator !=(S s1, S s2) => !s1.Equals(s2);
public override bool Equals(object? other)
{
// Implementation elided
return false;
}
public override int GetHashCode() => 0;
// Other details elided...
}
Bu hatayı düzeltmek için, nesne `null` ise yürütülecek null kontrolünü ve ilgili kodu kaldırın.
CS8848 - 'from' işleci öncelik sıralaması nedeniyle burada kullanılamaz. Parantez kullanarak netleştirme yapın.
Uyarı dalgası 5
Aşağıdaki örneklerde bu uyarı gösterilmektedir. İşleçlerin önceliği nedeniyle ifade yanlış bağlanır.
bool b = true;
var source = new Src();
b = true;
source = new Src();
var a = b && from c in source select c;
Console.WriteLine(a);
var indexes = new Src2();
int[] array = { 1, 2, 3, 4, 5, 6, 7 };
var range = array[0..from c in indexes select c];
Bu hatayı düzeltmek için sorgu ifadesinin çevresine parantez ekleyin:
bool b = true;
var source = new Src();
b = true;
source = new Src();
var a = b && (from c in source select c);
Console.WriteLine(a);
var indexes = new Src2();
int[] array = { 1, 2, 3, 4, 5, 6, 7 };
var range = array[0..(from c in indexes select c)];
Üyelerin tam olarak atanması gerekir. Atanmamış değişkenin kullanımı (CS8880, CS8881, CS8882, CS8883, CS8884, CS8885, CS8886, CS8887)
Uyarı dalgası 5
Birçok uyarı, içeri aktarılan derlemelerde bildirilen struct türleri için kesin atama analizini geliştirir. Bu yeni uyarıların tümü, içeri aktarılan derlemedeki bir yapı, aşağıdaki örnekte gösterildiği gibi başvuru türünde erişilemez bir alan (genellikle bir private alan) içerdiğinde oluşturulur:
public struct Struct
{
private string data = String.Empty;
public Struct() { }
}
Aşağıdaki örneklerde, geliştirilmiş kesin atama analizinden oluşturulan uyarılar gösterilmektedir:
- CS8880: Denetim çağırana döndürülmeden önce otomatik uygulanan 'Property' özelliği tam olarak atanmalıdır. Özelliği otomatik olarak varsayılan olarak ayarlamak için 'version' dil sürümüne güncelleştirmeyi göz önünde bulundurun.
- CS8881: Denetim çağırana döndürülmeden önce 'alan' alanı tamamen atanmalıdır. Alanı otomatik olarak varsayılan olarak ayarlamak için 'version' dil sürümüne güncelleştirmeyi göz önünde bulundurun.
- CS8882:
out'parameter' parametresine geçerli yöntemden ayrılmadan önce değer atanmalıdır. - CS8883: Muhtemelen atanmamış otomatik uygulanan 'Property' özelliğinin kullanımı.
- CS8884: Atanmamış olabilecek 'Alan' alanının kullanımı
- CS8885: 'this' nesnesi tüm alanları atanmadan önce kullanılamaz. Atanmamış alanları otomatik olarak varsayılan olarak ayarlamak için 'version' dil sürümüne güncelleştirmeyi göz önünde bulundurun.
- CS8886: Atanmamış 'parameterName' parametresinin kullanımı.
- CS8887: Atanmamış 'variableName' yerel değişkeninin kullanımı
public struct DefiniteAssignmentWarnings
{
// CS8880
public Struct Property { get; }
// CS8881
private Struct field;
// CS8882
public void Method(out Struct s)
{
}
public DefiniteAssignmentWarnings(int dummy)
{
// CS8883
Struct v2 = Property;
// CS8884
Struct v3 = field;
// CS8885:
DefiniteAssignmentWarnings p2 = this;
}
public static void Method2(out Struct s1)
{
// CS8886
var s2 = s1;
s1 = default;
}
public static void UseLocalStruct()
{
Struct r1;
var r2 = r1;
}
}
İçeri aktarılan yapıyı başlatarak veya varsayılan değerine atayarak bu uyarılardan herhangi birini düzeltebilirsiniz:
public struct DefiniteAssignmentNoWarnings
{
// CS8880
public Struct Property { get; } = default;
// CS8881
private Struct field = default;
// CS8882
public void Method(out Struct s)
{
s = default;
}
public DefiniteAssignmentNoWarnings(int dummy)
{
// CS8883
Struct v2 = Property;
// CS8884
Struct v3 = field;
// CS8885:
DefiniteAssignmentNoWarnings p2 = this;
}
public static void Method2(out Struct s1)
{
// CS8886
s1 = default;
var s2 = s1;
}
public static void UseLocalStruct()
{
Struct r1 = default;
var r2 = r1;
}
}
CS8892 - Eşzamanlı bir 'yöntem' giriş noktası bulunduğundan, yöntem giriş noktası olarak kullanılmayacak.
Uyarı dalgası 5
Bu uyarı, bir veya daha fazla zaman uyumlu giriş noktası dahil olmak üzere birden çok geçerli giriş noktanız olduğunda tüm zaman uyumsuz giriş noktası adaylarında oluşturulur.
Aşağıdaki örnek CS8892 oluşturur:
public static void Main()
{
RunProgram();
}
// CS8892
public static async Task Main(string[] args)
{
await RunProgramAsync();
}
Not
Derleyici her zaman zaman uyumlu giriş noktasını kullanır. Birden çok eşzamanlı giriş noktası olması durumunda bir derleyici hatası alırsınız.
Bu uyarıyı düzeltmek için zaman uyumsuz giriş noktasını kaldırın veya yeniden adlandırın.
CS8897 - Statik türler parametre olarak kullanılamaz
Uyarı dalgası 5
Bir arabirimin üyeleri, türü statik sınıf olan parametreleri bildiremez. Aşağıdaki kod hem CS8897 hem de CS8898'i gösterir:
public static class Utilities
{
// elided
}
public interface IUtility
{
// CS8897
public void SetUtility(Utilities u);
// CS8898
public Utilities GetUtility();
}
Bu uyarıyı düzeltmek için parametre türünü değiştirin veya yöntemini kaldırın.
CS8898 - Statik türler dönüş türleri olarak kullanılamaz
Uyarı dalgası 5
Bir arabirimin üyeleri statik sınıf olan bir dönüş türü bildiremez. Aşağıdaki kod hem CS8897 hem de CS8898'i gösterir:
public static class Utilities
{
// elided
}
public interface IUtility
{
// CS8897
public void SetUtility(Utilities u);
// CS8898
public Utilities GetUtility();
}
Bu uyarıyı düzeltmek için dönüş türünü değiştirin veya yöntemini kaldırın.