Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
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 tooverride
and explicit interface implementation methods to resolve ambiguities with nullable reference types. - Starting with C# 8, you can explicitly specify
where T : class
andwhere T : struct
constraints onoverride
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 { }
}