Udostępnij za pośrednictwem


Rozwiązywanie problemów z ostrzeżeniami związanymi z funkcjami i wersjami języka

W tym artykule omówiono następujące ostrzeżenia kompilatora:

  • CS8022, CS8023, CS8024, CS8025, CS8026, CS8059, CS8107, CS8302, CS8320, CS8370, CS8400, CS8773, CS8936, CS9058: Funkcja jest niedostępna. Użyj nowszej wersji językowej.
  • CS8058: Funkcja jest eksperymentalna.
  • CS8192: Podana wersja języka jest nieobsługiwana lub nieprawidłowa
  • CS8303: Określona wersja języka nie może mieć zer wiodących
  • CS8304: Wersja kompilatora jest mniejsza niż wersja języka
  • CS1738: Specyfikacje argumentów nazwanych muszą pojawić się po określeniu wszystkich stałych argumentów.
  • CS8306: Nazwa elementu krotki jest wnioskowana.
  • CS8314: Wyrażenie typu nie może być obsługiwane przez wzorzec typu
  • CS8371: Atrybuty docelowe pól dla właściwości automatycznych nie są obsługiwane w wersji językowej
  • CS8401: Aby użyć @$ zamiast $@ ciągu interpolowanego dosłownego, użyj nowszej wersji językowej.
  • CS8511: Wyrażenie typu nie może być obsługiwane przez wzorzec typu.
  • CS8627: Parametr typu dopuszczalnego do wartości null musi być znany jako typ wartości lub typ odwołania bez wartości null
  • CS8630: Nieprawidłowe opcje dopuszczania wartości null. Korzystanie z nowszej wersji językowej
  • CS8652: Modyfikator jest nieprawidłowy dla tego elementu.
  • CS8704: Typ nie implementuje elementu członkowskiego interfejsu. Nie można niejawnie zaimplementować elementu członkowskiego niepublicznie.
  • CS8706: Typ nie może zaimplementować elementu członkowskiego interfejsu, ponieważ funkcja nie jest dostępna w tej wersji.
  • CS8904: Nieprawidłowa wariancja: Parametr typu musi być prawidłowy.
  • CS8912: Dziedziczenie z rekordu z zapieczętowanym ciągiem "Object.ToString" nie jest obsługiwane.
  • CS8919: Nie można zaimplementować określonego elementu członkowskiego interfejsu w typie, ponieważ docelowe środowisko uruchomieniowe nie obsługuje statycznych elementów abstrakcyjnych w interfejsach
  • CS8929: Metoda nie może zaimplementować elementu członkowskiego interfejsu w typie, ponieważ docelowe środowisko uruchomieniowe nie obsługuje statycznych elementów abstrakcyjnych w interfejsach.
  • CS8957: Wyrażenie warunkowe jest nieprawidłowe w wersji językowej, ponieważ nie znaleziono wspólnego typu między typami.
  • CS8967: Nowe linie wewnątrz ciągu niesłownego interpolacji nie są obsługiwane w języku C#
  • CS9014: Błąd: Użycie prawdopodobnie nieprzypisanej właściwości. Uaktualnij właściwość do automatycznego ustawienia domyślnego.
  • CS9015: Błąd: użycie prawdopodobnie nieprzypisanego pola. Uaktualnij pole do automatycznego ustawienia domyślnego.
  • CS9016: Ostrzeżenie: użycie prawdopodobnie nieprzypisanej właściwości. Uaktualnij właściwość do automatycznego ustawienia domyślnego.
  • CS9017: Ostrzeżenie: Użycie prawdopodobnie nieprzypisanego pola. Uaktualnij pole do automatycznego ustawienia domyślnego.
  • CS9064: Docelowe środowisko uruchomieniowe nie obsługuje pól ref.
  • CS9103: Definicja w module z nierozpoznaną wersją RefSafetyRulesAttribute, spodziewającą się wartości "11".
  • CS9171: Środowisko uruchomieniowe obiektu docelowego nie obsługuje wbudowanych typów tablic.
  • CS9194: Argument może nie zostać przekazany za pomocą słowa kluczowego ref . Aby przekazać ref argumenty do in parametrów, uaktualnij go do wersji 12 lub nowszej.
  • CS9202: Funkcja nie jest dostępna w języku C# 12.0. Użyj nowszej wersji językowej
  • CS9211: Argument diagnosticId atrybutu "Eksperymentalny" musi być prawidłowym identyfikatorem.
  • CS9240: Docelowe środowisko uruchomieniowe nie obsługuje typów ogólnych podobnych do odwołania.
  • CS9260: Funkcja nie jest dostępna w języku C# 13.0. Użyj nowszej wersji językowej*

Ponadto następujące błędy i ostrzeżenia odnoszą się do zmian inicjowania struktury w ostatnich wersjach:

  • CS0171, CS8881: Pole pomocnicze dla automatycznie zaimplementowanej właściwości "name" musi być w pełni przypisane przed zwróceniem kontrolki do obiektu wywołującego.
  • CS0188, CS8885: Nie można użyć obiektu "this", zanim wszystkie jego pola zostaną przypisane do
  • CS0843, CS8880: Pole pomocnicze dla automatycznie zaimplementowanej właściwości "name" musi być w pełni przypisane przed zwróceniem kontrolki do obiektu wywołującego
  • CS8305: Funkcja jest przeznaczona tylko do celów ewaluacyjnych i może ulec zmianie lub usunięciu w przyszłych aktualizacjach.
  • CS9204: Typ jest przeznaczony tylko do celów ewaluacyjnych i może ulec zmianie lub usunięciu w przyszłych aktualizacjach. Pomiń tę diagnostykę, aby kontynuować.

Przyczyną wszystkich tych błędów i ostrzeżeń jest to, że zainstalowany kompilator obsługuje nowszą wersję języka C# niż wybrana wersja projektu. Kompilator języka C# może być zgodny z dowolną poprzednią wersją. Składnię można zweryfikować we wcześniejszej wersji języka C#lub dlatego, że projekt musi obsługiwać starsze biblioteki lub środowiska uruchomieniowe.

Istnieją dwie możliwe przyczyny i trzy sposoby rozwiązywania tych błędów i ostrzeżeń.

Aktualizowanie platformy docelowej

Kompilator określa wartość domyślną na podstawie następujących reguł:

Obiekt docelowy Wersja Domyślna wersja języka C#
.NET 9.x C# 13
.NET 8.x C# 12
.NET 7.x C# 11
.NET 6.x C# 10
.NET 5.x C# 9.0
.NET Core 3.x C# 8.0
.NET Core 2.x C# 7.3
.NET Standard 2.1 C# 8.0
.NET Standard 2.0 C# 7.3
.NET Standard 1.x C# 7.3
.NET Framework wszystkie C# 7.3

Jeśli wybrana struktura nie jest zgodna z wymaganą wersją języka, możesz uaktualnić platformę docelową.

Wybierz zgodną wersję języka

W pliku projektu może być wybrana starsza struktura docelowa. Jeśli usuniesz LangVersion element z pliku projektu, kompilator użyje wartości domyślnej wymienionej w poprzedniej sekcji. W poniższej tabeli przedstawiono wszystkie bieżące wersje języka C#. Można również określić określoną wersję języka, aby włączyć nowsze funkcje.

Wartość Znaczenie
preview Kompilator akceptuje całą prawidłową składnię języka z najnowszej wersji zapoznawczej.
latest Kompilator akceptuje składnię z najnowszej wydanej wersji kompilatora (w tym wersji pomocniczej).
latestMajor
lub default
Kompilator akceptuje składnię z najnowszej wydanej wersji głównej kompilatora.
13.0 Kompilator akceptuje tylko składnię zawartą w języku C# 13 lub niższym.
12.0 Kompilator akceptuje tylko składnię zawartą w języku C# 12 lub niższym.
11.0 Kompilator akceptuje tylko składnię zawartą w języku C# 11 lub niższym.
10.0 Kompilator akceptuje tylko składnię zawartą w języku C# 10 lub niższym.
9.0 Kompilator akceptuje tylko składnię zawartą w języku C# 9 lub niższym.
8.0 Kompilator akceptuje tylko składnię zawartą w języku C# 8.0 lub niższym.
7.3 Kompilator akceptuje tylko składnię zawartą w języku C# 7.3 lub niższym.
7.2 Kompilator akceptuje tylko składnię zawartą w języku C# 7.2 lub niższym.
7.1 Kompilator akceptuje tylko składnię zawartą w języku C# 7.1 lub niższym.
7 Kompilator akceptuje tylko składnię zawartą w języku C# 7.0 lub niższym.
6 Kompilator akceptuje tylko składnię zawartą w języku C# 6.0 lub niższym.
5 Kompilator akceptuje tylko składnię zawartą w języku C# 5.0 lub niższym.
4 Kompilator akceptuje tylko składnię zawartą w języku C# 4.0 lub niższym.
3 Kompilator akceptuje tylko składnię zawartą w języku C# 3.0 lub niższym.
ISO-2
lub 2
Kompilator akceptuje tylko składnię zawartą w iso/IEC 23270:2006 C# (2.0).
ISO-1
lub 1
Kompilator akceptuje tylko składnię zawartą w iso/IEC 23270:2003 C# (1.0/1.2).

Więcej informacji na temat wersji językowych obsługiwanych dla każdej wersji platformy można dowiedzieć się w artykule Konfigurowanie wersji językowej w sekcji dokumentacja języka.

Unikanie zaktualizowanej funkcji

Jeśli musisz obsługiwać starsze biblioteki lub środowiska uruchomieniowe, może być konieczne unikanie korzystania z nowszych funkcji.

Włączanie funkcji eksperymentalnych

Diagnostyka funkcji eksperymentalnych może być wyłączona w celu korzystania z funkcji eksperymentalnej.

Ostrzeżenie

Funkcje eksperymentalne podlegają zmianom. Interfejsy API mogą ulec zmianie lub mogą zostać usunięte w przyszłych aktualizacjach. Uwzględnienie funkcji eksperymentalnych to sposób na uzyskanie opinii autorów bibliotek na temat pomysłów i pojęć związanych z przyszłym opracowywaniem. Należy zachować szczególną ostrożność w przypadku używania dowolnej funkcji oznaczonej jako eksperymentalna.

Możesz również zadeklarować własne funkcje eksperymentalne przy użyciu elementu System.Diagnostics.CodeAnalysis.ExperimentalAttribute. Kompilator emituje CS9211 , jeśli identyfikator używany dla funkcji eksperymentalnej nie jest prawidłowym identyfikatorem.

Zmiany powodujące niezgodność dotyczące inicjowania struktury

Wszystkie te błędy i ostrzeżenia ułatwiają upewnienie się, że struct typy są prawidłowo inicjowane przed uzyskaniem dostępu do pól. We wcześniejszych wersjach języka C#należy jawnie przypisać wszystkie pola w strukturze w dowolnym konstruktorze. Konstruktor bez parametrów inicjuje wszystkie pola do ich wartości domyślnej. W nowszych wersjach wszystkie konstruktory inicjują wszystkie pola. Pole jest jawnie ustawione, ustawione w inicjatorze pola lub ustawione na wartość domyślną.

  • CS0171, CS8881: Pole pomocnicze dla automatycznie zaimplementowanej właściwości "name" musi być w pełni przypisane przed zwróceniem kontrolki do obiektu wywołującego.
  • CS0188, CS8885: Nie można użyć obiektu "this", zanim wszystkie jego pola zostaną przypisane do
  • CS0843, CS8880: Pole pomocnicze dla automatycznie zaimplementowanej właściwości "name" musi być w pełni przypisane przed zwróceniem kontrolki do obiektu wywołującego

Ten błąd można rozwiązać, uaktualniając wersję języka do języka C# 11, a każdy struct konstruktor inicjuje wszystkie pola. Jeśli ta opcja nie jest możliwa, należy jawnie wywołać konstruktor domyślny, jak pokazano w poniższym przykładzie:

struct S
{
    public int AIProp { get; set; }
    public S(int i){} //CS0843
    // Try the following lines instead.
    // public S(int i) : this()
    // {
    //     AIProp = i;
    // }
}

class Test
{
    static int Main()
    {
        return 1;
    }
}