Edit

Share via


Compiler Error CS0460

Constraints for override and explicit interface implementation methods are inherited from the base method, so they cannot be specified directly

When a generic method that is part of a derived class overrides a method in the base class, you can't specify constraints on the overridden method. The override method in the derived class inherits its constraints from the method in the base class.

However, there are exceptions to this rule:

  • Starting with C# 9, you can apply the default constraint to override and explicit interface implementation methods to resolve ambiguities with nullable reference types.
  • Starting with C# 8, you can explicitly specify where T : class and where T : struct constraints on override and explicit interface implementation methods to allow annotations for type parameters constrained to reference types.

Example

The following sample generates CS0460 when attempting to redeclare inherited constraints.

// CS0460.cs  
// compile with: /target:library  
class BaseClass
{  
   BaseClass() { }  
}  
  
interface I  
{  
   void F1<T>() where T : BaseClass;  
   void F2<T>() where T : struct;  
   void F3<T>();  
   void F4<T>() where T : struct;  
}  
  
class ExpImpl : I  
{  
    // CS0460 - cannot redeclare inherited constraint.
    void I.F1<T>() where T : BaseClass { }
    
    // Allowed - explicit constraint for struct.
    void I.F2<T>() where T : struct { }
   
    // Valid since C# 8 - explicit class constraint for nullable annotations.
    void I.F4<T>() where T : struct { }
    
    // Valid since C# 9 - default constraint to resolve ambiguities.
    void I.F3<T>() where T : default { }
}