8

Sono curioso di sapere se il parametro opzionale introdotto in C# 4 è retrocompatibile o no?Il parametro opzionale in C# 4 è compatibile con le versioni precedenti?

Lasciatemi chiarire la mia domanda con un semplice esempio. Supponiamo che io scrivo il seguente codice in C# 4 su .NET2 in VS2010:

public void Foo(int val1, int val2, int val3 = 5){ .... } 

Ora ho compilato il codice, faccio una dll e il riferimento ad un C#/C# 3 progetto 2 su .NET2. Nell'editor di codice (diverso da VS2010, ad esempio VS2008) cosa vedrò in intellisense?

  1. due metodi di overload come:

    public void Foo(int val1, int val2) 
    public void Foo(int val1, int val2, int val3) 
    
  2. qualcos'altro come:

    public void Foo(int val1, int val2, int val3) 
    public void Foo(int val1, int val2, int val3 = 5) //VS2008 is not supposed to show this 
    

Come dovrei chiamare il metodo C# 4 in C# 2 del progetto ?

risposta

9

Sarà solo un metodo: il compilatore C# non crea sovraccarichi. Sarà come se si stesse chiamando un metodo creato in VB.NET con parametri opzionali: sono stati in .NET fin dall'inizio. È solo che il compilatore C# 2 non saprà come gestirli, quindi dovrai specificare tu stesso tutti gli argomenti.

In pratica i parametri facoltativi cambiano solo come vengono chiamati i metodi. Se c'è un metodo come questo:

public void Foo(int x = 10, int y = 20) 

e si chiama in questo modo:

Foo(15); 

il compilatore C# 4 cambierà il lato chiamando al:

Foo(15, 20); 

Il C# Il compilatore 2 non può farlo, quindi dovresti specificare entrambi gli argomenti.

+0

Grazie mille. Chiarifica la mia domanda. Grazie. –

9

Vedrete un singolo metodo che ha tutti i parametri.

I metodi con parametri facoltativi in ​​C# 4 e ogni versione di VB sono compilati come un unico metodo con metadati CIL che indica quali parametri sono opzionali e quali sono i loro valori predefiniti.
C# 3 (sia il compilatore che IntelliSense di Visual Studio) ignora questi metadati.

Per ulteriori informazioni, vedere here.

Problemi correlati