次の方法で共有


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
    {
    }

}