2013-05-31 22 views
1

我有這樣的代碼(樣品重現):FxCop的CA1047 - 抽象和無障礙水平

public class ObjectBase<T> 
{ 
} 
public abstract class ExportBase 
{ 
    public void ExportData<T>(string path, T data, string filename) 
       where T : ObjectBase<T> 
    { 
     // Several verifications on data. 
     // Example: 
     if (data != null) 
     { 
      this.InnerExport(this.GetFileName<T>(path, filename), data); 
     } 
    } 
    protected abstract void InnerExport<T>(string path, T data) 
       where T : ObjectBase<T>; 

    public string GetFileName<T>(string path, string filename) 
    { 
     // Code. 
     return "TEST"; 
    } 
} 
internal sealed class XmlExport : ExportBase 
{ 
    protected override void InnerExport<T>(string path, T data) 
    { 
     // Code. 
    } 
} 

我不想XmlExport可見的(在我的類庫內部)也繼承了(密封)。

隨着FxCop的10.0,我有一個CA1047:DoNotDeclareProtectedMembersInSealedTypes

名稱:(FxCopCmd)
不要保護成員在封閉類型聲明。

描述:(FxCopCmd)
密封類型不能被擴展,和受保護成員 只有有用的,如果你可以擴展聲明類型。密封類型 不應聲明受保護的成員。

如何解決:(FxCopCmd)
製作員「XmlExport.InnerExport(字符串,T)的私人,公共 或內部(在Visual Basic朋友)。

信息:(的FxCop)
密封類型不能擴展,和受保護成員 只有有用的,如果你可以擴展聲明類型。 密封類型不應聲明受保護的成員。

但我不能將保護更改爲私有:虛擬或抽象成員不能是私有的。 也不公開(在這裏沒有意義)。

我知道我可以使用SuppressMessage,但我想知道是否有更好的方法(包括修改類)。

謝謝。

回答

1

這似乎是由於基於InnerExport方法聲明中的通用約束(「where T:ObjectBase」)觸發的規則中的錯誤。你應該將違規行爲壓制爲假陽性。如果你感覺特別敏銳,你也可以在https://connect.microsoft.com/visualstudio/上報告錯誤。

+1

同意。如果您報告連接時出現問題,請發佈鏈接,我會將其投票。 – RobSiklos

+0

好吧,沒料到^^我在[connect]上發佈了我的第一個bug(https://connect.microsoft.com/VisualStudio/feedback/details/789199/fxcop-ca1047-abstract-and-accessibility-水平)所以,我會按照你的建議壓制它,Nicole Calinoiu。謝謝。 – kerrubin

+0

該錯誤已作爲外部工具關閉:「產品團隊本身不再直接接受對Microsoft Visual Studio 2010及更早版本產品的反饋」...... – kerrubin

0

如果您只在庫中使用此功能,您可以將保護更改爲internal。但是,當您覆蓋時,您還必須在XmlExport中將其更改爲internal

+0

如果我更改爲內部,我可以訪問類外部的InnerExport(在我的庫中)。所以,我想避免這個解決方案。我不是唯一能夠處理這件事的人,所以,即使在評論中寫了'不要使用'......但是我始終牢記在心。 – kerrubin