CA2146:型別至少必須和基底型別與介面一樣關鍵
型別名稱 |
TypesMustBeAtLeastAsCriticalAsBaseTypes |
CheckId |
CA2146 |
分類 |
Microsoft.Security |
中斷變更 |
中斷 |
原因
透明型別衍生自標記 SecuritySafeCriticalAttribute 或 SecurityCriticalAttribute 的型別,或者標記 SecuritySafeCriticalAttribute 屬性的型別衍生自標記 SecurityCriticalAttribute 屬性的型別。
規則描述
當衍生型別有安全性透明屬性,且該屬性的重要性不如基底型別或已實作之介面時,就會引發這個規則。只有關鍵型別可以衍生自關鍵基底型別或實作關鍵介面,而且只有關鍵或安全關鍵型別可以衍生自安全關鍵基底型別或實作安全關鍵介面。在層級 2 透明度違反此規則會導致衍生型別的 TypeLoadException。
如何修正違規
若要修正此違規情形,請標記衍生型別,或者實作具有透明屬性的型別,且該型別的重要性至少要和基底型別或介面一樣。
隱藏警告的時機
請勿隱藏此規則的警告。
範例
using System;
using System.Security;
namespace TransparencyWarningsDemo
{
[SecuritySafeCritical]
public class SafeCriticalBase
{
}
// CA2156 violation - a transparent type cannot derive from a safe critical type. The fix is any of:
// 1. Make SafeCriticalBase transparent
// 2. Make TransparentFromSafeCritical safe critical
// 3. Make TransparentFromSafeCritical critical
public class TransparentFromSafeCritical : SafeCriticalBase
{
}
[SecurityCritical]
public class CriticalBase
{
}
// CA2156 violation - a transparent type cannot derive from a critical type. The fix is any of:
// 1. Make CriticalBase transparent
// 2. Make TransparentFromCritical critical
public class TransparentFromCritical : CriticalBase
{
}
// CA2156 violation - a safe critical type cannot derive from a critical type. The fix is any of:
// 1. Make CriticalBase transparent
// 2. Make CriticalBase safe critical
// 3. Make SafeCriticalFromCritical critical
[SecuritySafeCritical]
public class SafeCriticalFromCritical : CriticalBase
{
}
}