Sdílet prostřednictvím


Řešení upozornění souvisejících s jazykovými funkcemi a verzemi

Tento článek se zabývá následujícími upozorněními kompilátoru:

  • CS8022, CS8023, CS8024, CS8025, CS8026, CS8059, CS8107, CS8302, CS8320, CS8370, CS8400, CS8773, CS8936, CS9058: Funkce není k dispozici. Použijte novější jazyková verze.
  • CS8058: Funkce je experimentální.
  • CS8192: Poskytnutá jazyková verze není podporována nebo je neplatná
  • CS8303: Zadaná jazyková verze nemůže mít úvodní nuly
  • CS8304: Verze kompilátoru je menší než jazyková verze
  • CS1738: Specifikace pojmenovaných argumentů musí být uvedeny po zadání všech pevných argumentů.
  • CS8306: Název elementu řazené kolekce členů je odvozen.
  • CS8314: Výraz typu nelze zpracovat vzorem typu
  • CS8371: Atributy cílené na pole u automatických vlastností nejsou podporovány v jazykové verzi.
  • CS8401: Chcete-li místo interpolovaného doslovného řetězce použít @$ $@ novější jazykovou verzi.
  • CS8511: Výraz typu nelze zpracovat vzorem typu.
  • CS8627: Parametr typu s možnou hodnotou null musí být znám jako typ hodnoty nebo odkazový typ bez hodnoty null.
  • CS8630: Neplatné možnosti s možnou hodnotou null. Použití novější jazykové verze
  • CS8652: Modifikátor není pro tuto položku platný.
  • CS8704: Typ neimplementuje člena rozhraní. Nemůže implicitně implementovat neveřejný člen.
  • CS8706: Typ nemůže implementovat člen rozhraní, protože funkce není v této verzi k dispozici.
  • CS8904: Neplatná odchylka: Parametr typu musí být platný.
  • CS8912: Dědění ze záznamu s zapečetěným objektem Object.ToString není podporováno.
  • CS8919: Zadaný člen rozhraní nelze implementovat v typu, protože cílový modul runtime nepodporuje statické abstraktní členy v rozhraních.
  • CS8929: Metoda nemůže implementovat člen rozhraní typu, protože cílový modul runtime nepodporuje statické abstraktní členy v rozhraních.
  • CS8957: Podmíněný výraz není v jazykové verzi platný, protože mezi typy nebyl nalezen běžný typ.
  • CS8967: Newlines inside a non-verbatim interpolated string are not supported in C#
  • CS9014: Chyba: Použití pravděpodobně nepřiřazené vlastnosti. Upgradujte na automatické výchozí nastavení vlastnosti.
  • CS9015: Chyba: Použití pravděpodobně nepřiřazeného pole Upgradujte na automatické výchozí pole.
  • CS9016: Upozornění: Použití pravděpodobně nepřiřazené vlastnosti. Upgradujte na automatické výchozí nastavení vlastnosti.
  • CS9017: Upozornění: Použití pravděpodobně nepřiřazeného pole Upgradujte na automatické výchozí pole.
  • CS9064: Cílový modul runtime nepodporuje pole ref.
  • CS9103: Definice v modulu s nerozpoznanou verzí RefSafetyRulesAttribute, která očekává "11".
  • CS9171: Cílový modul runtime nepodporuje vložené typy polí.
  • CS9194: Argument nemusí být předán s klíčovým slovem ref . Pokud chcete předat ref argumenty in parametrům, upgradujte na jazyk verze 12 nebo vyšší.
  • CS9202: Funkce není dostupná v jazyce C# 12.0. Použijte novější jazyková verze.
  • CS9211: Argument diagnosticId atributu Experimentální musí být platný identifikátor.
  • CS9240: Cílový modul runtime nepodporuje obecné typy podobné odkazu.
  • CS9260: Funkce není dostupná v jazyce C# 13.0. Použijte novější jazyková verze.*

Kromě toho následující chyby a upozornění souvisí se změnami inicializace struktury v posledních verzích:

  • CS0171, CS8881: Před vrácením ovládacího prvku volajícímu musí být plně přiřazeno záložní pole pro automaticky implementovanou vlastnost name.
  • CS0188, CS8885: Před přiřazením všech polí nelze použít tento objekt.
  • CS0843, CS8880: Backing field for automatically implement property 'name' musí být plně přiřazen před vrácením ovládacího prvku volajícímu.
  • CS8305: Funkce je určena pouze pro účely vyhodnocení a v budoucích aktualizacích se může změnit nebo odebrat.
  • CS9204: Typ je určen pouze pro účely vyhodnocení a v budoucích aktualizacích se může změnit nebo odebrat. Chcete-li pokračovat, potlačíte tuto diagnostiku.

Příčinou všech těchto chyb a upozornění je, že kompilátor nainstalovaný podporuje novější verzi jazyka C#, než je verze, kterou váš projekt vybral. Kompilátor jazyka C# může odpovídat jakékoli předchozí verzi. Syntaxi můžete ověřit v dřívější verzi jazyka C#, nebo proto, že váš projekt musí podporovat starší knihovny nebo moduly runtime.

Existují dvě možné příčiny a tři způsoby řešení těchto chyb a upozornění.

Aktualizace cílové architektury

Kompilátor určuje výchozí hodnotu na základě těchto pravidel:

Cíl Verze Výchozí verze jazyka 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 vše C# 7.3

Pokud vybraná architektura neodpovídá požadované jazykové verzi, můžete cílovou architekturu upgradovat.

Výběr odpovídající jazykové verze

V souboru projektu můžete mít vybranou starší cílovou architekturu. Pokud odeberete LangVersion prvek ze souboru projektu, kompilátor použije výchozí hodnotu uvedenou v předchozí části. V následující tabulce jsou uvedeny všechny aktuální jazykové verze jazyka C#. Můžete také zadat konkrétní jazykovou verzi, která povolí novější funkce.

Hodnota Význam
preview Kompilátor přijímá veškerou platnou syntaxi jazyka z nejnovější verze Preview.
latest Kompilátor přijímá syntaxi z nejnovější vydané verze kompilátoru (včetně podverze).
latestMajor
nebo default
Kompilátor přijímá syntaxi z nejnovější vydané hlavní verze kompilátoru.
13.0 Kompilátor přijímá pouze syntaxi, která je součástí jazyka C# 13 nebo nižší.
12.0 Kompilátor přijímá pouze syntaxi, která je součástí jazyka C# 12 nebo nižší.
11.0 Kompilátor přijímá pouze syntaxi, která je součástí jazyka C# 11 nebo nižší.
10.0 Kompilátor přijímá pouze syntaxi, která je součástí jazyka C# 10 nebo nižší.
9.0 Kompilátor přijímá pouze syntaxi, která je součástí jazyka C# 9 nebo nižší.
8.0 Kompilátor přijímá pouze syntaxi, která je součástí C# 8.0 nebo nižší.
7.3 Kompilátor přijímá pouze syntaxi, která je součástí jazyka C# 7.3 nebo nižší.
7.2 Kompilátor přijímá pouze syntaxi, která je součástí jazyka C# 7.2 nebo nižší.
7.1 Kompilátor přijímá pouze syntaxi, která je součástí jazyka C# 7.1 nebo nižší.
7 Kompilátor přijímá pouze syntaxi, která je součástí jazyka C# 7.0 nebo nižší.
6 Kompilátor přijímá pouze syntaxi, která je součástí jazyka C# 6.0 nebo nižší.
5 Kompilátor přijímá pouze syntaxi, která je součástí jazyka C# 5.0 nebo nižší.
4 Kompilátor přijímá pouze syntaxi, která je součástí jazyka C# 4.0 nebo nižší.
3 Kompilátor přijímá pouze syntaxi, která je součástí jazyka C# 3.0 nebo nižší.
ISO-2
nebo 2
Kompilátor přijímá pouze syntaxi, která je součástí ISO/IEC 23270:2006 C# (2.0).
ISO-1
nebo 1
Kompilátor přijímá pouze syntaxi, která je součástí ISO/IEC 23270:2003 C# (1.0/1.2).

Další informace o jazykových verzích podporovaných pro každou verzi architektury najdete v článku o konfiguraci jazykové verze v referenční části jazyka.

Vyhněte se aktualizované funkci

Pokud potřebujete podporovat starší knihovny nebo moduly runtime, možná se budete muset vyhnout používání novějších funkcí.

Povolení experimentálních funkcí

Diagnostiku experimentálních funkcí je možné zakázat, aby se používala experimentální funkce.

Upozorňující

Experimentální funkce se můžou měnit. Rozhraní API se můžou změnit nebo se můžou v budoucích aktualizacích odebrat. Zahrnutí experimentálních funkcí je způsob, jak autorům knihoven získat zpětnou vazbu k nápadům a konceptům pro budoucí vývoj. Při použití jakékoli funkce označené jako experimentální používejte extrémní opatrnost.

Můžete také deklarovat vlastní experimentální funkce pomocí nástroje System.Diagnostics.CodeAnalysis.ExperimentalAttribute. Kompilátor generuje CS9211, pokud identifikátor použitý pro experimentální funkci není platný identifikátor.

Zásadní změny inicializace struktury

Všechny tyto chyby a upozornění pomáhají zajistit, aby struct se typy před přístupem k jejich polím správně inicializovaly. V dřívějších verzích jazyka C# musíte explicitně přiřadit všechna pole ve struktuře v libovolném konstruktoru. Konstruktor bez parametrů inicializuje všechna pole na výchozí hodnotu. V novějších verzích inicializují všechny konstruktory všechna pole. Buď je pole explicitně nastaveno, nastaveno v inicializátoru pole nebo nastaveno na výchozí hodnotu.

  • CS0171, CS8881: Před vrácením ovládacího prvku volajícímu musí být plně přiřazeno záložní pole pro automaticky implementovanou vlastnost name.
  • CS0188, CS8885: Před přiřazením všech polí nelze použít tento objekt.
  • CS0843, CS8880: Backing field for automatically implement property 'name' musí být plně přiřazen před vrácením ovládacího prvku volajícímu.

Tuto chybu můžete vyřešit upgradem jazykové verze na C# 11. Každý struct konstruktor inicializuje všechna pole. Pokud to není možná možnost, musíte explicitně volat výchozí konstruktor, jak je znázorněno v následujícím příkladu:

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;
    }
}