CA2146: 型は、基本型およびインターフェイスと同程度以上、重要でなければならない
TypeName |
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
{
}
}