-
Notifications
You must be signed in to change notification settings - Fork 6.1k
Update CS0460 documentation to include C# 8/9 constraint exceptions #46528
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 2 commits
2288d13
d8238d3
485c1b2
40001c0
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,7 +1,7 @@ | ||
| --- | ||
| description: "Compiler Error CS0460" | ||
| title: "Compiler Error CS0460" | ||
| ms.date: 07/20/2015 | ||
| ms.date: 01/02/2025 | ||
| f1_keywords: | ||
| - "CS0460" | ||
| helpviewer_keywords: | ||
|
|
@@ -10,13 +10,17 @@ | |
| --- | ||
| # Compiler Error CS0460 | ||
|
|
||
| Constraints for override and explicit interface implementation methods are inherited from the base method, so they cannot be specified directly | ||
| Constraints for override and explicit interface implementation methods are inherited from the base method, so they cannot be specified directly, except in specific cases | ||
BillWagner marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
|
||
| When a generic method that is part of a derived class overrides a method in the base class, you may not specify constraints on the overridden method. The override method in the derived class inherits its constraints from the method in the base class. | ||
BillWagner marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
|
||
| 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. | ||
|
Check failure on line 18 in docs/csharp/misc/cs0460.md
|
||
| - 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. | ||
|
Check failure on line 19 in docs/csharp/misc/cs0460.md
|
||
|
|
||
| ## Example | ||
|
|
||
| The following sample generates CS0460. | ||
| The following sample generates CS0460 when attempting to redeclare inherited constraints. | ||
|
|
||
| ```csharp | ||
| // CS0460.cs | ||
|
|
@@ -30,12 +34,19 @@ | |
| { | ||
| void F1<T>() where T : BaseClass; | ||
| void F2<T>() where T : struct; | ||
| void F3<T>() where T : BaseClass; | ||
| void F3<T>(); | ||
| void F4<T>() where T : struct; | ||
| } | ||
|
|
||
| class ExpImpl : I | ||
| { | ||
| void I.F1<T>() where T : BaseClass {} // CS0460 | ||
| void I.F2<T>() where T : class {} // CS0460 | ||
| void I.F1<T>() where T : BaseClass {} // CS0460 - cannot redeclare inherited constraint | ||
| void I.F2<T>() where T : struct {} // CS0460 - cannot redeclare inherited constraint | ||
| // Valid since C# 8 - explicit class constraint for nullable annotations | ||
| void I.F4<T>() where T : class {} // OK - explicit constraint for nullable annotations | ||
| // Valid since C# 9 - default constraint to resolve ambiguities | ||
| void I.F3<T>() where T : default {} // OK - default constraint | ||
BillWagner marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| } | ||
| ``` | ||
Uh oh!
There was an error while loading. Please reload this page.