2013-04-22 46 views
6

SA1125:UseShorthandForNullableTypes具有本說明書中(從4.7 StyleCop的設置編輯器應用程序截取):SA1125:爲什麼強制執行「int?」而不是「Nullable <int>」,但不在「typeof()」中?

強制使用空類型的速記而不是除外typeof()內的Nullable<T>的。

是否有一個原因爲什麼它有typeof()聲明的例外? typeof(int?)編譯也很好 - 這只是StyleCop作者的偏好,還是有更深的理由?

編輯:自正式文件沒有提到這一例外,我測試了以下代碼:

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

結果:只有第一線提高了SA1125警告。

編輯2The work item for StyleCop asking to fix this behavior

+2

你在哪裏找到你所引用的描述?當然不在您提供的鏈接中,也不在[官方文檔]中(http://www.stylecop.com/docs/SA1125。HTML) – 2013-04-22 11:41:11

+0

我會建議一個錯誤,或者錯過了一個要求。即使在'typeof()'中,ReSharper也會提示我將'Nullable '重寫爲'int?'。 – 2013-04-22 11:42:35

+0

我在StyleCop設置編輯器工具中找到了描述。現在的問題是它是否準確... – 2013-04-22 11:43:11

回答

0

我的意見是,這至多是一個錯誤,至少是一個錯過的行爲。該代碼指出:

// 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)) 
    { 

它看起來像它試圖支持Nullable<>typeof(Nullable<>)內。但是,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

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

所以從我個人理解,對基本搜索手寫泛型類型,並處理的Nullable<>它們允許的特殊情況,因爲沒有速記。 AFAIK,Nullable<>只有在typeof()的情況下才有意義,所以我猜他們在這種情況下是例外。

+1

+1開放的通用案例是有道理的。好主意! – 2013-04-22 11:53:36

+0

IL與你期望的'Nullable 'vs'int?'也是一樣的,所以我會說這是一個錯誤或者錯過了一個需求,很可能是因爲'typeof中的開放泛型支持)'。 – 2013-04-22 11:55:46

+0

@AdamHouldsworth:你爲什麼提到生成的IL?這不是重點。因爲C#編譯器用'Nullable '替換'int?',所生成的IL怎麼會有不同*?這裏的要點是關於StyleCop規則。你究竟在這裏看到什麼是錯誤或錯過了要求? – 2013-04-22 12:05:46

相關問題