Прежде всего, я знаю, что на этот вопрос можно ответить простым ответом, что пустая строка не является нулевым значением. Кроме того, я только недавно обнаружил операторы приведения в начале года с помощью другого вопроса stackoverflow, и у меня нет большого опыта работы с ними. Тем не менее, причина, по которой все не так просто, заключается в том, что эти операторы приведения в сочетании с оператором объединения нулей выставляются как элегантное решение для устранения ошибок, таких как отсутствующие элементы или атрибуты в выражениях LINQ. Я начал использовать подход, описанный Скоттом в «Улучшение запаха кода LINQ ...» и ScottGu «Нулевой оператор объединения (и использование его с LINQ)» в качестве способа защиты против недействительных / пропущенных данных в сжатой и полус элегантной манере. Насколько я могу судить, это, кажется, одна из причин, по которой все перегрузки приведения в классы LINQ ставятся на первое место.
Итак, на мой взгляд, сценарий использования обращения с отсутствующим значением не сильно отличается от случая использования пустого значения, и в связанных статьях этот подход считается хорошим способом решения таких ситуаций. .
Сценарий:
int length = (int?)elem.Attribute("Length") ?? 0;
Если атрибут @Length отсутствует, приведение приводит к нулевому значению и ?? оператор возвращает 0;
Если атрибут @Length существует, но он пуст, внутреннее преобразование преобразуется в int.tryparse и выдает исключение формата. Конечно, для моего использования я хотел бы, чтобы он не возвращался и просто возвращал бы нуль, чтобы я мог продолжать использовать этот подход в своем уже несколько запутанном коде LINQ.
В конечном счете, не столько я не могу придумать решение, но еще больше, чтобы мне было интересно услышать, есть ли очевидный подход, который я пропустил, или если у кого-то есть хорошая точка зрения о том, почему пропал Сценарий стоимости был рассмотрен, но сценарий пустого значения не был.
Редактировать
Кажется, есть несколько ключевых моментов, которые я должен попытаться выделить:
Связанные статьи принадлежат сотрудникам MS, которыми я восхищаюсь и обращаюсь за руководством. Эти статьи, кажется, предлагают (или, по крайней мере, привлекают внимание) улучшенный / альтернативный подход для работы с необязательными значениями
В моем случае необязательные значения иногда бывают в виде отсутствующих элементов или атрибутов, но также имеют форму пустых элементов или значений
Описанный подход работает как ожидалось для пропущенных значений, но не работает для пустых значений
Код, который следует описанному подходу, по-видимому, защищает от отсутствия дополнительных значений, но на самом деле является хрупким и ломается в конкретном случае. Меня беспокоит появление защиты, когда на самом деле вы все еще в опасности
Это можно подчеркнуть, заявив, что оба связанных примера завершаются неудачно с исключением времени выполнения, если целевой элемент существует, но пуст
Наконец, кажется, что ключевым моментом является то, что описанный подход прекрасно работает, когда у вас есть контракт (возможно, через схему), который гарантирует, что элемент или атрибут никогда не будут 1053 * пустыми, но в случаях там, где этот контракт не существует, этот подход недействителен и требуется альтернатива