Как переопределить оператор `is`

мы знаем:

int? number = 10;
Console.WriteLine(number is int); // true

а

NotNull<string> text = "10"; // NotNull<> is my struct
Console.WriteLine(text is string); // false

Я хочу, чтобы text is string возвращал true, как я могу это сделать?

-------------------------------- edit

вот мой NotNull:

public class NotNull<T> where T : class
{
    public T Value { get; }

    private NotNull(T value)
    {
        this.Value = value;
    }

    public static implicit operator T(NotNull<T> source)
    {
        return source.Value;
    }

    public static implicit explicit NotNull<T>(T value)
    {
        if (value == null) throw new ArgumentNullException(nameof(value));
        return new NotNull<T>(value);
    }
}

если класс объявлял:

public class A
{
    public NotNull<string> B { get; set; }
}

Я просто надеюсь, что любой сериализатор может сериализовать и десериализовать его так же, как:

public class A
{
    public string B { get; set; }
}

-------------------------------- edit 2

Я понял, что это нерешенный вопрос:

  • Если NotNull<> является классом, default(NotNull<>) имеет значение null, я ничего не делаю.
  • if NotNull<> is struct, default(NotNull<>).Value имеет значение null.

извините за вопрос.

Ответы

Ответ 1

Как уже указывалось другими, is не может быть перегружен. Если вы разместите больше контекста о своей строке, отличной от нуля, возможно, мы сможем найти другое решение.

Оператор is работает с типами NULL и их базовыми типами не потому, что он перегружен, а потому, что это поведение явно определено в спецификации языка. Необязательные типы рассматриваются как частный случай, когда оценивается is.

Подробное описание оператора is вы можете найти в разделе 7.10.10 спецификации языка С#. Ниже приведены части, относящиеся к типам NULL:

Результат операции E is T, где E - выражение, а T - тип (...) оценивается следующим образом

• (...)

• В противном случае пусть D представляет динамический тип E следующим образом:

  • (...)

  • Если тип E является нулевым типом, D является базовым типом этого типа с нулевым значением.

• Результат операции зависит от D и T следующим образом:

  • (...)

  • Если T является нулевым типом, результат является истинным, если D является базовым типом T.

  • Если T - тип значения, не равный nullable, результат будет истинным, если D и T являются одним и тем же типом.