C#における汎用制約(where)は何ですか?


    :                     。

  :https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/generics/generic-classes

拘束
説明
T:構造
タイプパラメータは値タイプでなければなりません.
T:クラス
タイプパラメータは参照タイプでなければなりません.この点は、クラス、インタフェース、委任、配列タイプにも適用されます.
T:new()
タイプパラメータには、パラメータなしの共通構造関数が必要です.他のコンストレイントと一緒に使用する場合は、new()コンストレイントを最後に指定する必要があります.
T:
タイプパラメータは、指定したベースクラスまたは指定したベースクラスから派生する必要があります.
T:
タイプパラメータは、指定したインタフェースまたは実装指定したインタフェースでなければなりません.複数のインタフェースコンストレイントを指定できます.コンストレイントインタフェースは汎用であってもよい.
T:U
Tに提供されるタイプのパラメータは、Uに提供されるパラメータまたはUに提供されるパラメータから派生する必要がある.
    T  :   Access    Access    
    public class BaseAccess where T : Access
    {
    }


    T  :T                  
    public class BaseAccess where T : IAggregateRoot
    {
    }

           
    public class BaseAccess where T : class
    {
    }

          
    public class BaseAccess where T : struct
    {
    }

         
    public class BaseAccess where T : new()
    {
         MongoContextAdapter _context;
        public BaseAccess(MongoContextAdapter context)
        {
            this._context = context;
        }
    }

                          ,        
    public class BaseAccess where T : class,new()
    {


    }

    K           
    V          
    public class BaseAccess
        where K : class,new()
        where V : struct
    {


    }


    ///     K    V         K,V       ,        
    public class BaseAccess
        where K : V
        where K : class,new()
        where V : class,new()
    {
    }



    T  :   Access    Access    
    public class BaseAccess where T : Access
    {
    }


    T  :T                  
    public class BaseAccess where T : IAggregateRoot
    {
    }

           
    public class BaseAccess where T : class
    {
    }

          
    public class BaseAccess where T : struct
    {
    }

         
    public class BaseAccess where T : new()
    {
         MongoContextAdapter _context;
        public BaseAccess(MongoContextAdapter context)
        {
            this._context = context;
        }
    }

                          ,        
    public class BaseAccess where T : class,new()
    {


    }

    K           
    V          
    public class BaseAccess
        where K : class,new()
        where V : struct
    {


    }


    ///     K    V         K,V       ,        
    public class BaseAccess
        where K : V
        where K : class,new()
        where V : class,new()
    {
    }