Condividi tramite


Risolvere gli errori e gli avvisi nelle dichiarazioni del costruttore

Questo articolo illustra gli errori del compilatore seguenti:

  • CS0514: Il costruttore statico non può avere una chiamata esplicita al costruttore 'this' o a un 'base'.
  • CS0515: i modificatori di accesso non sono consentiti nei costruttori statici.
  • CS0516: Costruttore 'constructor' non può chiamare se stesso.
  • CS0517: 'class' non dispone di una classe base e non può chiamare un costruttore di base.
  • CS0522: le strutture non possono chiamare i costruttori della classe base.
  • CS0526: le interfacce non possono contenere costruttori.
  • CS0568: gli struct non possono contenere costruttori senza parametri espliciti.
  • CS0710: classi statiche non possono avere costruttori di istanza.
  • CS0768: Costruttore non può chiamare se stesso tramite un altro costruttore.
  • CS8054: Enumerazioni non possono contenere costruttori espliciti senza parametri.
  • CS8091: non può essere esterno e avere un inizializzatore del costruttore.
  • CS8861: elenco di argomenti imprevisti.
  • CS8862: Un costruttore dichiarato in un tipo con una lista di parametri deve avere l'inizializzatore del costruttore 'this'.
  • CS8358: Impossibile usare il costruttore dell'attributo perché contiene parametri 'in'.
  • CS8867: Nessun costruttore di copia accessibile trovato nel tipo di base '{0}'.
  • CS8868: Un costruttore di copia in un record deve chiamare un costruttore di copia della base o un costruttore di oggetti senza parametri se il record eredita dall'oggetto .
  • CS8878: Un costruttore di copia '{0}' deve essere pubblico o protetto perché il record non è sigillato.
  • CS8910: Il costruttore primario è in conflitto con il costruttore di copia sintetizzato.
  • CS8958: Il costruttore di struct senza parametri deve essere 'public'.
  • CS8982: Un costruttore dichiarato in uno 'struct' con elenco di parametri deve avere un inizializzatore 'this' che chiama il costruttore primario o un costruttore dichiarato in modo esplicito.
  • CS8983: un 'struct' con inizializzatori di campo deve includere un costruttore dichiarato in modo esplicito.
  • CS9105: Impossibile usare il parametro del costruttore primario in questo contesto.
  • CS9106: l'identificatore è ambiguo tra il tipo e il parametro in questo contesto.
  • CS9108: Non è possibile usare un parametro di tipo simile a ref all'interno di un metodo anonimo, un'espressione lambda, un'espressione di query o una funzione locale.
  • CS9109: All'interno di un membro dell'istanza, non si può utilizzare il parametro del costruttore principale ref, out, o in.
  • CS9110: Impossibile utilizzare un parametro del costruttore primario di tipo simile a ref all'interno di un membro dell'istanza.
  • CS9111: metodi anonimi, espressioni lambda, espressioni di query e funzioni locali all'interno di un membro dell'istanza di uno struct non possono accedere al parametro del costruttore primario.
  • CS9112: metodi anonimi, espressioni lambda, espressioni di query e funzioni locali all'interno di uno struct non possono accedere al parametro del costruttore primario usato anche all'interno di un membro dell'istanza.
  • CS9114: Un parametro del costruttore primario di un tipo readonly non può essere assegnato (tranne nel setter init-only del tipo o un inizializzatore di variabile).
  • CS9115: Un parametro del costruttore primario di un tipo readonly non può essere restituito dal riferimento scrivibile.
  • CS9116: In un tipo readonly, un parametro del costruttore primario non può essere utilizzato come valore ref o out, tranne nel setter init-only del tipo o in un inizializzatore di variabile.
  • CS9117: Membri del parametro del costruttore primario di un tipo readonly non possono essere modificati (tranne nel setter init-only del tipo o di un inizializzatore di variabile).
  • CS9118: Membri del parametro costruttore principale di un tipo a sola lettura non possono essere restituiti tramite un riferimento scrivibile.
  • CS9119: I membri del parametro del costruttore primario di un tipo readonly non possono essere utilizzati come valore ref o out (ad eccezione del setter init-only del tipo o di un inizializzatore di variabile).
  • CS9120: Impossibile restituire il parametro del costruttore primario come riferimento.
  • CS9121: Il parametro di tipo del costruttore primario della struttura provoca un ciclo nel layout della struttura.
  • CS9122: lista di parametri inattesa.
  • CS9136: Impossibile usare un parametro del costruttore primario di un tipo specifico all'interno di un membro dell'istanza.

In questo articolo sono inoltre illustrati gli avvisi seguenti:

  • CS0824: Costruttore 'name' è contrassegnato come esterno.
  • CS9107: Il parametro è acquisito nello stato del tipo circostante e lo stesso valore viene passato anche al costruttore di base. Il valore potrebbe essere acquisito anche dalla classe di base.
  • CS9113: parametro non letto.
  • CS9124: Il parametro viene catturato nello stato del tipo circostante e il relativo valore viene usato per inizializzare un campo, una proprietà o un evento.
  • CS9179: il parametro del costruttore primario è ombreggiato da un membro della base

Costruttori statici

  • CS0514: Un costruttore statico non può avere una chiamata esplicita al costruttore 'this' o 'base'.
  • CS0515: i modificatori di accesso non sono consentiti nei costruttori statici.

È possibile scrivere al massimo un costruttore statico per un tipo. La dichiarazione di un costruttore statico deve rispettare le regole seguenti:

  • Il costruttore statico ha il modificatore static, ma non altri modificatori, ad esempio public, protected, privateo internal.
  • Il costruttore statico deve essere un costruttore senza parametri.
  • Il costruttore statico non deve chiamare base() o this(). Se la classe base include un costruttore statico, il runtime lo chiama automaticamente.

Dichiarazione del costruttore

  • CS0526: le interfacce non possono contenere costruttori.
  • CS0710: classi statiche non possono avere costruttori di istanza.
  • CS8054: Enumerazioni non possono contenere costruttori espliciti senza parametri.
  • CS8358: Impossibile usare il costruttore dell'attributo perché include parametri 'in'.
  • CS8091: Un costruttore non può essere extern e avere un inizializzatore del costruttore.

I costruttori sono consentiti solo nei tipi class e struct, inclusi i tipi record class e record struct. Non è possibile definirli nei tipi enum o interface. Inoltre, i tipi di classi attributo non possono dichiarare parametri in. Passare invece i parametri per valore.

Si possono dichiarare costruttori extern, ma non è possibile usare le chiamate al costruttore base() o this() per invocare un altro costruttore all'interno di un costruttore dichiarato extern.

Inoltre, è possibile generare gli avvisi seguenti per le dichiarazioni del costruttore:

  • CS0824: Costruttore è contrassegnato come esterno.

Quando un costruttore è contrassegnato extern, il compilatore non può garantire che il costruttore esista. Di conseguenza, il compilatore genera questo avviso.

Costruttori nei tipi struct

  • CS0568: gli struct non possono contenere costruttori espliciti senza parametri.
  • CS8958: Il costruttore di struct senza parametri deve essere 'public'.
  • CS8982: Un costruttore dichiarato in un 'struct' con elenco di parametri deve avere un inizializzatore 'this' che chiama il costruttore primario o un costruttore dichiarato in modo esplicito.
  • CS8983: uno 'struct' con inizializzatori di campo deve includere un costruttore dichiarato in modo esplicito.

Le funzionalità recenti in C# rimuovono le restrizioni precedenti ai tipi struct. CS0568 viene generato quando si dichiara un costruttore di istanza senza parametri nelle versioni precedenti di C#. È possibile dichiarare un costruttore di istanza senza parametri esplicito nelle versioni più recenti di C#. Il costruttore esplicito senza parametri deve essere public. Se struct dichiara gli inizializzatori di campo , devi anche dichiarare un costruttore di istanza esplicito. Questo costruttore può essere un costruttore senza parametri con un corpo vuoto.

Quando un tipo struct dichiara un costruttore primario, inclusi i tipi record struct, tutti gli altri costruttori di istanza tranne un costruttore senza parametri devono chiamare il costruttore primario o un altro costruttore dichiarato in modo esplicito usando this().

Chiamate del costruttore con base e this

  • CS0516: Costruttore non può chiamare se stesso.
  • CS0517: Classe non dispone di una classe di base e non può chiamare un costruttore di base.
  • CS0522: gli struct non possono chiamare costruttori di classi di base.
  • CS0768: Costruttore non può chiamare se stesso tramite un altro costruttore.

È possibile utilizzare base() e this() per fare in modo che un costruttore chiami un altro costruttore nello stesso tipo o nel tipo base. I costruttori chiamanti possono ridurre al minimo la logica del costruttore duplicata. È necessario seguire queste regole quando si chiama un altro costruttore usando this() o base():

  • Un costruttore non può chiamare se stesso direttamente o indirettamente tramite un altro costruttore. Ad esempio, il codice seguente non è valido:

    public class C
    {
      public C() : this() // Error!
      {
      }
    }
    
    public class C2
    {
      public class C2() : this(10) {}
    
      public class C2(int capacity) : this() 
      {
          _capacity = capacity;
      }
    
      private int _capacity;
    }
    ``
    
    
  • I tipi di struct non possono chiamare base(). Nemmeno System.Objectpuò.

Record e costruttori di copia

  • CS8867: Nessun costruttore di copia accessibile trovato nel tipo di base.
  • CS8868: Un costruttore di copia in un record deve chiamare un costruttore di copia della base o un costruttore di oggetti senza parametri se il record eredita dall'oggetto .
  • CS8878: Un costruttore di copia deve essere pubblico o protetto perché il record non è sigillato.
  • CS8910: Il costruttore primario è in conflitto con il costruttore di copia sintetizzato.

Aggiungere il modificatore record a un tipo struct o class crea un record . I record includono un costruttore di copia sintetizzato dal compilatore. È possibile scrivere manualmente un costruttore di copia esplicito, ma deve rispettare le regole seguenti:

  • I costruttori di copia devono essere public o protected a meno che il tipo non sia sealed.
  • I costruttori di copia devono chiamare il costruttore di copia base() a meno che la classe di base non sia System.Object.
  • Inoltre, il tipo di base deve avere un costruttore di copia. I tipi record hanno sempre un costruttore di copia.

Dichiarazione del costruttore primario

Il compilatore genera gli errori seguenti quando un costruttore primario viola una o più regole sui costruttori primari per classi e struct:

  • CS8861: elenco di argomenti imprevisti.
  • CS8862: Un costruttore definito in un tipo che contiene un elenco di parametri deve avere l'inizializzatore del costruttore 'this'.
  • CS9105: Impossibile usare il parametro del costruttore primario in questo contesto.
  • CS9106: l'identificatore è ambiguo tra il tipo e il parametro in questo contesto.
  • CS9108: Impossibile utilizzare un parametro che ha un tipo simile a ref all'interno di un metodo anonimo, un'espressione lambda, un'espressione di query o una funzione locale.
  • CS9109: Non è possibile usare ref, outo in parametro del costruttore primario all'interno di un membro dell'istanza.
  • CS9110: Non è possibile usare il parametro del costruttore primario con tipo simile-ref all'interno di un membro di istanza.
  • CS9111: I metodi anonimi, le espressioni lambda, le espressioni di query e le funzioni locali all'interno di un membro istanza di una struttura non possono accedere al parametro del costruttore primario.
  • CS9112: metodi anonimi, espressioni lambda, espressioni di query e funzioni locali all'interno di uno struct non possono accedere al parametro del costruttore primario usato anche all'interno di un membro dell'istanza.
  • CS9114: Un parametro del costruttore primario di un tipo readonly non può essere assegnato a (tranne che nel setter accessibile solo durante l'inizializzazione del tipo o in un inizializzatore di variabile).
  • CS9115: Un parametro del costruttore primario di un tipo readonly non può essere restituito tramite un riferimento scrivibile.
  • CS9116: Parametro del costruttore primario di un tipo readonly non può essere usato come valore ref o out (ad eccezione del setter init-only del tipo o di un inizializzatore di variabile).
  • CS9117: Membri del parametro del costruttore primario di un tipo readonly non possono essere modificati (tranne nel setter init-only del tipo o di un inizializzatore di variabile).
  • CS9118: Membri del parametro del costruttore primario di un tipo readonly non possono essere restituiti da riferimenti scrivibili.
  • CS9119: Membri del parametro del costruttore primario di un tipo readonly non possono essere usati come valore ref o out (ad eccezione del setter init-only del tipo o di un inizializzatore variabile).
  • CS9120: Non è possibile restituire un parametro del costruttore principale per riferimento.
  • CS9121: Il parametro di tipo del costruttore primario Struct causa un ciclo nel layout dello struct.
  • CS9122: elenco di parametri imprevisti.
  • CS9124: Parametro viene acquisito nello stato del tipo di inclusione e il relativo valore viene usato anche per inizializzare un campo, una proprietà o un evento.
  • CS9136: Impossibile usare il parametro del costruttore primario di tipo all'interno di un membro dell'istanza.

I parametri del costruttore primario sono visibili nel corpo del tipo. Il compilatore può sintetizzare un campo che archivia il parametro da usare nei membri o negli inizializzatori di campo. Poiché un parametro del costruttore primario può essere copiato in un campo, si applicano le restrizioni seguenti:

  • I costruttori primari possono essere dichiarati nei tipi struct e class, ma non nei tipi interface.
  • I parametri del costruttore primario non possono essere usati in una chiamata del costruttore base() tranne che come parte del costruttore primario.
  • I parametri del costruttore primario del tipo ref struct non sono accessibili nelle espressioni lambda, nelle espressioni di query o nelle funzioni locali.
  • Se il tipo non è un ref struct, non è possibile accedere ai parametri ref struct nei membri di istanza.
  • In un tipo ref struct, i parametri del costruttore primario con i modificatori in, ref, o out non possono essere utilizzati in alcun metodo di istanza o accessor di proprietà.

I tipi struct presentano le seguenti restrizioni aggiuntive sui parametri del costruttore primario:

  • I parametri del costruttore primario non possono essere acquisiti in espressioni lambda, espressioni di query o funzioni locali.
  • I parametri del costruttore primario non possono essere restituiti per riferimento (restituitiref o restituiti readonly ref).

Solo i tipi struct di sola lettura presentano le seguenti restrizioni aggiuntive per i parametri del costruttore primario:

  • I parametri del costruttore primario e i relativi membri non possono essere riassegnati in uno struct readonly.
  • I parametri del costruttore primario e i relativi membri non possono essere ref restituiti nella struttura readonly.
  • I parametri del costruttore primario e i loro membri non possono essere argomenti ref o out per alcun metodo.

In tutti questi casi, le restrizioni sui parametri del costruttore primario sono coerenti con le restrizioni sui campi dati in tali tipi. Le restrizioni sono dovuto al fatto che un parametro del costruttore primario può essere trasformato in un campo sintetizzato nel tipo . Pertanto, i parametri del costruttore primario devono seguire le regole che si applicano a tale campo sintetizzato.

Un costruttore primario derivato chiama il costruttore primario di base fornendo i parametri al costruttore di base. È necessario usare i nomi dei parametri dalla dichiarazione del costruttore derivato.

Gli avvisi forniscono indicazioni sui parametri del costruttore primario acquisiti o mascherati.

  • CS9107: Parametro viene acquisito nello stato del tipo di inclusione e il relativo valore viene passato anche al costruttore di base. Il valore potrebbe essere acquisito anche dalla classe di base. Questo avviso indica che il codice può essere allocato a due copie di un parametro del costruttore primario. Poiché il parametro viene passato alla classe base, la classe base lo usa probabilmente. Poiché la classe derivata vi accede, può avere una seconda copia dello stesso parametro. Tale spazio di archiviazione aggiuntivo potrebbe non essere previsto.
  • CS9113: Parametro non letto. Questo avviso indica che la classe non fa mai riferimento al costruttore primario, neanche per passarlo al costruttore primario di base. Probabilmente non è necessario.
  • CS9124: Il parametro viene acquisito nello stato del tipo che lo racchiude e il suo valore viene usato anche per inizializzare un campo, una proprietà o un evento. Questo avviso indica che il parametro del costruttore di un tipo annidato viene acquisito anche dal tipo che lo racchiude. Il parametro è probabilmente archiviato due volte.
  • CS9179: parametro del costruttore primario è oscurato da un membro del di base