31

この新機能は本当に便利です。

最近、「Microsoft All-In-One Code Framework」のドキュメントを読んだところ、「オプションのパラメーター」は CLS に準拠していないと書かれていました。

そこで、パブリック API で「オプションのパラメーター」を使用してテストし、FxCop を有効にしてからコンパイルしましたが、FxCop は何も文句を言いませんでした。その間、戻り値の型として uint を持つ API を追加すると、FxCop は警告を報告しました。

だから今、私は混乱しています.「オプションのパラメータ」はCLSに準拠していますか?

また、新しい言語機能が CLS に準拠しているかどうかを確認する最善の方法は何ですか?

4

3 に答える 3

28

オプションの引数は、"ある程度の" CLS 準拠です。オプションの引数を持つメソッドは正当であり、CLSCompliant属性を使用して正常にコンパイルできます、これらのメソッドの呼び出し元は、既定のパラメーター値またはオプションの属性を考慮する必要はありません。(その場合、これらのメソッドは標準メソッドとまったく同じように動作し、すべての引数を呼び出しサイトで明示的に指定する必要があります。)

既定のパラメーターを使用するメソッドは、共通言語仕様 (CLS) で許可されています。ただし、CLS を使用すると、コンパイラはこれらのパラメーターに割り当てられた値を無視できます。既定のパラメーター値を無視するコンパイラ用に記述されたコードは、既定のパラメーターごとに明示的に引数を指定する必要があります。プログラミング言語間で必要な動作を維持するには、既定のパラメーターを使用するメソッドを、既定のパラメーターを提供するメソッド オーバーロードに置き換える必要があります。

( 「CA1026: デフォルトのパラメーターは使用しないでください」のドキュメントから引用。)

于 2011-03-28T09:44:13.420 に答える
8

私はあなたの質問をオプションの引数についてであると解釈します。

もしそうなら、私はそれらがCLS準拠であると信じており、CLSCompliant属性を使用して確認できます。

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

これは警告なしでコンパイルされます。

于 2011-03-28T09:40:45.027 に答える
0

CLS仕様を見てください。
41ページから:

この時点以降のすべての引数がオプションであることを示すために、vararg 制約を含めることができます。表示される場合、呼び出し規約は、可変引数リストをサポートするものでなければなりません。

しかし、すぐ下のボックスには次のように書かれています。

CLS ルール 15: vararg 制約は CLS の一部ではなく、CLS でサポートされている唯一の呼び出し規約は、標準のマネージド呼び出し規約です。

于 2011-03-28T09:29:36.470 に答える