価値があるものとして、MicrosoftのRoslynコンパイラで、クラスの名前を変更することなく、ジェネリッククラスからの継承を使用する方法の例を次に示します。(私はこれに困惑していたので、これが本当に可能かどうかを調べるためにここで検索をしました。)
プロジェクトCodeAnalysisでは、この定義を見つけることができます。
/// <summary>
/// Common base class for C# and VB PE module builder.
/// </summary>
internal abstract class PEModuleBuilder<TCompilation, TSourceModuleSymbol, TAssemblySymbol, TTypeSymbol, TNamedTypeSymbol, TMethodSymbol, TSyntaxNode, TEmbeddedTypesManager, TModuleCompilationState> : CommonPEModuleBuilder, ITokenDeferral
where TCompilation : Compilation
where TSourceModuleSymbol : class, IModuleSymbol
where TAssemblySymbol : class, IAssemblySymbol
where TTypeSymbol : class
where TNamedTypeSymbol : class, TTypeSymbol, Cci.INamespaceTypeDefinition
where TMethodSymbol : class, Cci.IMethodDefinition
where TSyntaxNode : SyntaxNode
where TEmbeddedTypesManager : CommonEmbeddedTypesManager
where TModuleCompilationState : ModuleCompilationState<TNamedTypeSymbol, TMethodSymbol>
{
...
}
次に、プロジェクトCSharpCodeanalysisに次の定義があります。
internal abstract class PEModuleBuilder : PEModuleBuilder<CSharpCompilation, SourceModuleSymbol, AssemblySymbol, TypeSymbol, NamedTypeSymbol, MethodSymbol, SyntaxNode, NoPia.EmbeddedTypesManager, ModuleCompilationState>
{
...
}
この非ジェネリックPEModuleBuilderクラスは、CSharpCodeanalysisプロジェクトで広く使用されており、そのプロジェクトのいくつかのクラスが直接または間接的に継承します。
そして、プロジェクトBasicCodeanalysisには次の定義があります。
Partial Friend MustInherit Class PEModuleBuilder
Inherits PEModuleBuilder(Of VisualBasicCompilation, SourceModuleSymbol, AssemblySymbol, TypeSymbol, NamedTypeSymbol, MethodSymbol, SyntaxNode, NoPia.EmbeddedTypesManager, ModuleCompilationState)
RoslynがC#とその使用方法に関する幅広い知識を持つ人々によって書かれたと(できれば)想定できるので、これはこの手法の推奨事項だと考えています。