Здесь вы описываете две разные ситуации:
- Возвращает тип значения, который не может быть нулевым (как в вашем примере)
- Возвращает ссылочный тип (как в API, который вы фактически связали) - и это относится также к
Nullable
типам.
A тип значения не может быть нулевым, поэтому вы можете вернуть -1
для ситуации "not found". Вы часто не можете вернуть 0
, потому что большую часть времени ноль является допустимым значением. В этом случае -1
является часовым значением .
Теперь переменная , которая ссылается на ссылочный тип (class
) объекта может быть нулевой (то есть: не ссылаться ни на какой объект). Однако вы также можете создать свой ссылочный тип так, чтобы он имел «состояние дозорного», что означает «недопустимый».
Это, конечно, полная боль в заднице. Не делай этого.
Вместо проверки этого:
if(foo != null) ...
Вы будете делать это:
if(foo != null && foo.IsValid) ...
Что является более трудоемким, и даже если что-то принуждает ненулевое значение, вам все равно придется сделать это:
if(foo.IsValid) ...
Что на самом деле ничего не выигрывает. Плюс вам придется написать весь дополнительный код для обработки дополнительного бита состояния в в каждом отдельном классе , который вы пишете.
Настоящая проблема вашей теории - ваша идея, что метод должен возвращать null
, если «что-то пошло не так внутри». В этом случае метод почти наверняка сгенерирует исключение .