Первое, что вы должны сделать в этой ситуации, это потренироваться , почему компилятор жалуется. Очевидно, он думает, что есть какой-то способ выполнить ни из этих назначений. Теперь иногда это потому, что компилятор "тупой" (или, скорее, потому что языковой дизайн не достаточно мощный, чтобы заметить, когда вы рассмотрели все возможные случаи). Однако обычно это потому, что вы что-то упустили или сделали предположение, которое компилятор не хочет делать.
Вы сделали предположение, что значение homeAddressText.Text
останется неизменным между двумя вызовами (что не обязательно верно) и , что !=
и ==
будут давать обратные ответы когда даны те же самые операнды (что является более разумным допущением, но компилятор не сделает). Фактически, компилятор даже не пытается быть умным здесь - он рассматривает только каждое условие отдельно, поэтому даже это не компилируется:
// Local variable - can't possibly change...
int x = ...;
int y;
if (x == 5)
{
y = 1;
}
else if (x != 5) // The compiler *could* realize this is the inverse...
{
y = 2;
}
Console.WriteLine(y);
В конечном счете, язык не станет более сложным, чтобы позволить вам писать избыточный код - лучше , чтобы заставить вас удалить избыточность.
Итак, как мы можем избежать этого? Как мы можем дать понять компилятору и любым будущим читателям, что мы определенно выберем тот или иной курс? Мы можем просто удалить условие второго варианта:
if (homeAddressText.Text == String.Empty)
{
homeAdd = " ";
}
else
{
homeAdd = homeAddressText.Text;
}
Теперь мы, очевидно, возьмем первую ветвь или вторую, поскольку в этом весь смысл блока else
. Тем не менее, теперь у нас есть шаблон:
if (condition)
{
variable = expression1;
}
else
{
variable = expression2;
}
и лично Мне нравится использовать условный оператор в таких ситуациях - это делает всю цель "Я хочу присвоить значение переменной на основе условия" более явным:
variable = condition ? expression1 : expression2;
Так что в этом случае ваш код будет выглядеть так:
homeAdd = homeAddressText.Text == String.Empty ? " " : homeAddressText.Text;
Теперь, возможно, я бы оставил это, но было бы хорошо , если бы мы могли упомянуть homeAddressText.Text
один раз . Если вы делаете это регулярно, возможно, вы захотите написать метод расширения:
public static string DefaultIfNullOrEmpty(this string input, string defaultValue)
{
return string.IsNullOrEmpty(input) ? defaultValue : input;
}
Тогда ваше назначение становится:
homeAdd = homeAddress.Text.DefaultIfNullOrEmpty(" ");
Это очень явно относится к ситуациям, в которых используется значение по умолчанию (например, оно не по умолчанию, если у вас только что есть пробел), но если краткость важнее для вас, вы можете переименовать это:
homeAdd = homeAddress.Text.OrDefault(" ");