C#11 подпись `IParsable<TSelf>`
Я начал играть с новыми интерфейсами в C # 11 сstatic abstract
методы. Одна вещь, которую я не понимаю, это необходимость общего ограничения в , которое определяется как:
//
// Summary:
// Defines a mechanism for parsing a string to a value.
//
// Type parameters:
// TSelf:
// The type that implements this interface.
public interface IParsable<TSelf> where TSelf : IParsable<TSelf>?
{
static abstract TSelf Parse(string s, IFormatProvider? provider);
static abstract bool TryParse([NotNullWhen(true)] string? s,
IFormatProvider? provider, [MaybeNullWhen(false)] out TSelf result);
}
почему бы просто не
public interface IParsable<TSelf>
{
static abstract TSelf Parse(string s, IFormatProvider? provider);
static abstract bool TryParse([NotNullWhen(true)] string? s,
IFormatProvider? provider, [MaybeNullWhen(false)] out TSelf result);
}
Я понимаю, что последний позволит такие вещи, как:
class MyInt : IParsable<int>
{
public static abstract int Parse(string s, IFormatProvider? provider)
{...}
...
}
это не тот способ, которым должен быть реализован интерфейс, тип класса и должен быть таким же. Но первый позволяет реализовать любой типIParsable<TSelf>
который включает в себя другие типы, кромеint
.
Кроме того, нельзя ли было ввести новыйTSelf
ключевое слово, представляющее тип класса, реализующего интерфейс (думаю, в Delphi была такая штука сClassType
)?