Как переопределить оператор `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 следующим образом:
• Результат операции зависит от D и T следующим образом:
-
(...)
-
Если T является нулевым типом, результат является истинным, если D является базовым типом T.
-
Если T - тип значения, не равный nullable, результат будет истинным, если D и T являются одним и тем же типом.
Ответ 2
В MSDN у вас есть список перегружаемых операторов:
Перегружаемые операторы (Руководство по программированию на С#)
Эти операторы не могут быть перегружены:
=,.,?:,??, → , = > , f (x), as, checked, unchecked, default, delegate, is, new, sizeof, typeof
Ответ 3
is
Оператор не является переопределяемым оператором
проверьте это, чтобы узнать больше о операторах overridbale Учебное пособие по перегрузке операторов