2013-04-22 22 views
6

SA1125SA1125:なぜ "int?" "Nullable <int>"ではなく "typeof()"内ではありませんか?

がNULL可能タイプの速記なくtypeof()内部以外Nullable<T>の使用を強制:UseShorthandForNullableTypesは(StyleCop 4.7設定エディタアプリケーションから引用)この記述を有します。

typeof()の例外はありますか? typeof(int?)はちゃんとコンパイルされます。これはStyleCopの作者の好みなのでしょうか、それとも深い推論ですか?

編集は:

var x = new Nullable<int>(); 
var y = new int?(); 
var z = typeof(Nullable<int>); 
var v = typeof(int?); 

結果:最初の行のみがSA1125の警告を上げる公式ドキュメントはこの例外に言及していないので、私は次のコードをテストしました。

編集2:(私はこのルールの開発者ではないんだと)私は実際に、私はそれは、このための警告を生成しないためにこのように設計されて疑う理由は分からないもののThe work item for StyleCop asking to fix this behavior

+2

あなたが引用されている説明を見つけるのですか?確かにあなたが提供したリンクではなく、[公式文書](http://www.stylecop.com/docs/SA1125)にも記載されていません。html) –

+0

おそらく、バグや欠落した要件を示唆しています。 ReSharperは、 'nullofable 'を 'int 'として' typeof() 'に書き直すように促します。 –

+0

StyleCop設定エディタツールで説明が見つかりました。今、問題の質問、それは正確であればある... –

答えて

0

私の意見は、これは多くのバグであり、少なくとも逃した動作です。コードは述べている:typeof(Nullable<>)の内部Nullable<>をサポートしようとしているように見える

// Check the declaration of the generic type for longhand, but allow Nullable<> which has no shorthand 
if (genericType.ChildTokens.Count > 0 && Utils.TokenContainNullable(genericType.ChildTokens.First)) 
{ 
    if (genericType.Parent == null || !(genericType.Parent is TypeofExpression)) 
    { 

。しかし、TypeofExpressionのチェックは、明白な理由がない限り、が閉鎖されたジェネリックを間違ってフィルタリングします。 CheckShorthandForNullableTypesため

ルック:

http://stylecop.codeplex.com/SourceControl/changeset/view/249eed5b15ed#Project/Src/AddIns/CSharp/Analyzers/ReadabilityRules.cs

3

typeofの具体的な使用方法:これは実際に公式の理由である場合

typeof(Nullable<>) 

言われていることは、彼らがこの特定の使用のための例外をハードコードの代わりに、typeof(Nullable<X>)のすべての使用のために例外を書いたかもしれません。

これはすべての仮定のみであることに注意してください。


source code of StylecopからEDIT :

// Check the declaration of the generic type for longhand, but allow Nullable<> which has no shorthand 

だから、私が理解から、ノーがあるので基本的には、手書きジェネリック型を探し、それらができるようNullable<>の特殊なケースを扱います簡略化のために利用可能。 AFAIK、Nullable<>typeof()というコンテキストでのみ意味があるので、私は彼らがこのケースの例外を作ったと推測しています。

+1

+1オープンジェネリック場合は理にかなって: –

+0

ILは、あなたが期待するよう '?' int型VS 'NULL可能'のためにも同じであるので、私はこれが原因(typeof演算 'でオープンジェネリックのサポート、バグや逃した要件である可能性が高いでしょうね) '。 –

+0

@AdamHouldsworth:なぜあなたは生成されたILに言及していますか?それはここでのポイントではありません。 C#コンパイラは 'int?'を 'Nullable 'に置き換えているので、生成されたILはどのように*異なっていますか?ここでのポイントは、StyleCopルールについてです。そして、あなたはここでバグや欠落した要求と正確に何をしていますか? –

関連する問題