-
Notifications
You must be signed in to change notification settings - Fork 7
Description
Based on the work for #42 it would be nice to have the same feature also für discriminated unions implemented the C# record syntax.
public abstract record Result<TSuccess, TError> {
private Result() { }
public sealed record Success(TSuccess Value) : Result<TSuccess, TError>;
public sealed record Error(TError value) : Result<TSuccess, TError>;
}A switch with missing arms could also giving the analyzer error however there's a slight source of errors:
It is technically possible to subclass from the Result record outside of the scope because the C# record syntax for non-sealed records always creates a protected copy constructor. Anyway I would argue that the developer intention is clear as there are some intrinsics about what the copy constructor does and where it is used.
This line of code compiles even outside of the Result record but providing a concrete instance (Error in this case) does not make real sense as only the properties of the base record would be considered in the copy constructor:
public record OtherResult(string Value) : Result<string, string>(new Error(Value))See also this StackOverflow question to see there are also other developers interested in such a feature.
As I understand it however, to really detect that situation, we must switch to Roslyn version 3.9.0 as the IsRecord property was added to the type symbol interface.