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)?

0 ответов

Другие вопросы по тегам