C#4.0の新機能 - 「オプションのパラメータ」CLS準拠はありますか?
-
12-11-2019 - |
質問
この新機能は本当に便利です。
最近私は「Microsoft All-on-One Code Framework」の文書を読み、「オプションのパラメータ」がCLS準拠ではないことを示しています。
だから私は公開APIの「オプションのパラメータ」を使用してテストし、FXCOPをオンにした後、コンパイルし、FXCOPは何も文句を言わなかった。その間に、FXCOPは、UINTを持つAPIを戻したタイプとして追加すると、FXCOPは警告を報告しました。
だから今私は混乱しています、「オプションのパラメータ」CLS準拠または違いはありませんか?
そして新しい言語機能がCLS準拠かどうかを調べるための最良の方法は何ですか?
解決
オプション引数は「ソートオブ」コンプライアンスです。オプションの引数を持つメソッドは有効で、CLSCompliant
属性、で正常にコンパイルできます。これらのメソッドの呼び出し元は必ずしもデフォルトのパラメータ値またはオプションの属性を考慮に入れる必要があります。 (その場合、それらの方法は標準的な方法と全く同じ方法で動作し、すべての引数が通話サイトで明示的に記載されていることを必要とする。)
デフォルトパラメータを使用するメソッド 共通言語の下で許可されています 仕様(CLS);しかし、CLS. コンパイラが値を無視することを許可します これらのパラメータに割り当てられています。 コンパイラ用に書かれたコード デフォルトのパラメータ値を無視します 明示的に引数を提供する必要があります 各デフォルトパラメータ維持する あなたが望む行動 プログラミング言語、メソッド デフォルトのパラメータを使用してください 方法の過負荷に置き換えられました デフォルトのパラメータを入力してください。
他のヒント
あなたの質問を解釈するオプション引数
そうであれば、私は彼らが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());
}
}
}
.
これは警告なしでコンパイルされます。