Question

Cette nouvelle fonctionnalité est vraiment pratique.

Dernièrement, je lis le document du "Framework de code Microsoft All-in-One", et il mentionne que les "paramètres facultatifs" ne sont pas conformes à CLS.

Je l'ai donc testé en utilisant des "paramètres facultatifs" dans une API publique, et j'ai allumé FXCOP, puis j'ai compilé et FXCOP ne se plaignait de rien. Au moyen, FXCOP a signalé un avertissement lorsque j'ajoute une API qui a un type de retour.

Alors maintenant, je suis confus, les "paramètres facultatifs" sont-ils conformes aux CLS ou non?

Et quelle est la meilleure façon de savoir si une nouvelle fonctionnalité linguistique est conforme à CLS ou non?

Était-ce utile?

La solution

Les arguments facultatifs sont "en quelque sorte" conformes aux CL. Les méthodes avec des arguments facultatives sont légales et peuvent être compilées avec succès avec le CLSCompliant attribut, mais Les appelants de ces méthodes n'ont pas nécessairement besoin de tenir compte des valeurs de paramètre par défaut ou de l'attribut facultatif. (Dans ce cas, ces méthodes se comporteraient exactement de la même manière que les méthodes standard, exigeant que tous les arguments soient énoncés explicitement sur le site d'appel.)

Les méthodes qui utilisent les paramètres par défaut sont autorisées sous la spécification du langage commun (CLS); Cependant, le CLS permet aux compilateurs d'ignorer les valeurs qui sont affectées à ces paramètres. Le code écrit pour les compilateurs qui ignorent les valeurs de paramètre par défaut doivent explicitement fournir des arguments pour chaque paramètre par défaut. Pour maintenir le comportement que vous souhaitez dans les langages de programmation, les méthodes qui utilisent les paramètres par défaut doivent être remplacées par des surcharges de méthode qui fournissent les paramètres par défaut.

(Tiré de la documentation pour "CA1026: les paramètres par défaut ne doivent pas être utilisés".)

Autres conseils

J'interprète votre question comme par Arguments facultatifs.

Si c'est le cas, je crois qu'ils sont conformes aux CL et vous pouvez vérifier en utilisant le CLS compatible attribut:

using System;

[assembly: CLSCompliant(true)]

namespace ConsoleApplication1
{
    public class Program
    {
        public static int Test(int val=42)
        {
            return val;
        }

        static void Main(string[] args)
        {
            System.Console.WriteLine(Test());
        }
    }
}

Cela compile sans avertissements.

Jetez un œil au Spécifications CLS.
De la page 41:

La contrainte Vararg peut être incluse pour indiquer que tous les arguments au-delà de ce point sont facultatifs. Lorsqu'il apparaît, la convention d'appel sera celle qui prend en charge les listes d'arguments variables.

Mais la boîte en dessous dit:

CLS Règle 15: La contrainte Vararg ne fait pas partie du CLS, et la seule convention d'appel soutenue par le CLS est la convention d'appel gérée standard

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top