8

Je suis curieux de savoir si le paramètre optionnel introduit dans C# 4 est rétrocompatible ou non? Permettez-moi de clarifier ma question avec un exemple simple. Supposons que j'écris le code suivant dans C# 4 sur .NET2 dans VS2010:Le paramètre optionnel dans C# 4 est-il compatible avec les versions antérieures?

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

Maintenant, je compilé le code, faire une dll et la référence à un C# 2/C# 3 projet sur .NET2. Dans l'éditeur de code (autre que VS2010, dis VS2008) que vais-je voir dans intellisense?

  1. Deux méthodes surchargées comme:

    public void Foo(int val1, int val2) 
    public void Foo(int val1, int val2, int val3) 
    
  2. Autre chose comme:

    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 
    

Comment je suis censé appeler la méthode C# 4 en C# 2 projet ?

Répondre

9

Ce sera juste une méthode - le compilateur C# ne crée pas de surcharges. Ce sera comme si vous appeliez une méthode créée dans VB.NET avec des paramètres optionnels - ils ont été dans .NET dès le début. C'est juste que le compilateur C# 2 ne saura pas comment les traiter, donc vous devrez spécifier tous les arguments vous-même.

Fondamentalement, les paramètres facultatifs changent uniquement la façon dont les méthodes sont appelées. S'il y a une méthode comme ceci:

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

et vous l'appelez comme ceci:

Foo(15); 

le compilateur C# 4 va changer le appelant côté à:

Foo(15, 20); 

Le C# 2 compilateur ne peut pas faire cela, donc vous devez spécifier les deux arguments.

+0

Merci beaucoup. Cela clarifie ma question. Je vous remercie. –

9

Vous verrez une seule méthode qui a tous les paramètres.

Les méthodes avec des paramètres facultatifs dans C# 4 et chaque version de VB sont compilées comme une méthode unique avec des métadonnées CIL indiquant quels paramètres sont facultatifs et quelles sont leurs valeurs par défaut.
C# 3 (à la fois le compilateur et IntelliSense de Visual Studio) ignore cette métadonnée.

Pour plus d'informations, voir here.