Как стать автором
Обновить

Комментарии 43

Возможно проверить существует или нет значение у переменной
Пока в голову приходит только explicit приведения типа… Пытаюсь изобразить в коде…
ждем-с )
Необходимость, в том смысле, что нельзя заменить конструкцию if'ом? Или в том смысле, что нельзя заменить конструкцию строчкой bool b=x (или строчкой bool b=(bool)x)? Мое предположение — x может иметь тип bool? позволяющий принимать значение null.
необходимость в том, что нельзя написать bool b=x;
решение что х типа bool? первое, которое приходит всем в голову, но в таком случае указанный код не скомпилируется
Т.е. вы утверждаете что такой код не скомпилируется
bool x = true;
bool b = x? true: false;
?
я утверждаю, что не скомпилируется код
bool? x = true;
bool b = x? true: false;

я также утверждаю, что такой код скомпилируется:
bool x = true;
bool b = x;

но обе эти ситуации не имеют отношения к этюду
Хе, а забавно получилось. Хотя по идее работать такое не должно…
весь свой код в этюдах я предварительно проверяю, так что все прекрасно работает
Я же не утверждаю что он не рабочий :)
Просто, пока не разобрался в моём подсознании он был как неявный. Сейчас вполне себе такой «явный».
Хотя нет, вполне имеет право на жизнь.
Всё разобрался как работает.
Спасибо!
Ну а в чём смысл-то? В кастомной инициализации?
если x истинный будет проинициализировано true иначе false.

Есть ещё такоей момент:
public static implicit operator DBBool(bool x)
{
return x? True: False;
}
но на первоначальную конструкцию он что-то не похож…

public static implicit operator bool(X x) { return x.inner; }

Вот так лучше :)
SqlBoolean x = SqlBoolean.Null; =)
браво! Ваше решение засчитывается, но я предполагал кастомный класс, а о том, что подобное есть во фреймворке, даже не подозревал. все-таки не настолько сферический конь )

сможете обобщить ситуацию и указать, что особенного есть в SqlBoolean?
неа :) этот класс доделан :)
можно делать так

SqlBoolean x = SqlBoolean.Null;
bool b = (bool)x;


так что ответ неверный… но суть уловили верно :)
да, и здесь Вы правы, можно было придраться )
class test
{
int i = 0;
public static bool operator true(test x) { return true; }
public static bool operator false(test x) { return false; }

}
смс ответ ниже. уже минут 5 ))
необходимость такого есть только в том случае, если x объявлен как bool? x;
смотрите выше, при Nullable код просто не скомпилируется
public struct SomeClass
{
public static bool operator false(SomeClass x)
{
return false;
}
public static bool operator true(SomeClass x)
{
return true;
}
}
сразу после написал Вам, что Вы решили правильно, но видимо, не засабмитил комментарий )
видно, перепутал кнопки предпросмотр и написать
А можно пояснить что это за странные операторы? До меня пока не доходит решение.
Правильно ли я понимаю, что запись x?a:b эквивалентна чему-то вроде if (x.operator_true()) { return a;}else if (x.operator_false()){return b;} else{ throw new NullPointerException();}? По указанной ссылке этот вопрос не разъясняется.
нет, она эквивалентна X.operator true(x)? a: b;
вызывается только один оператор из двух (они должны быть всегда определены вместе)
какой именно вызывается, зависит от того, какой выгоднее, чтобы оборвать вычисления: если, к примеру, выражение x1 && x2, то вызовется false, если x1 || x2, вызовется true

соответственно, тот, кто пишет эти операторы, может оптимизировать каждый из них под нужную ситуацию. но в любом случае они должны давать противоположный результат
>> должны давать противоположный результат

По моему, это никак гарантировать нельзя. Или я ошибаюсь?
конечно, забота об этом ложится на разработчика. как и в случае перегрузки GetHashCode — пользователь должен гарантировать, что для объекта с одним и тем же состоянием будет возвращаться один и тот же хэш
смотрите в PPS, надеюсь, понятно написал
bananafish, ты?
а если по делу, но я не представляю почему нельзя это же заменить на bool b = (bool)x;
Хотя если вы индус, которому платят (по слухам) за объем кода, то «в каком случае появляется необходимость» писать такой код
я никогда не пользовался ником бананафиш
в данном случае нельзя заменить на bool b = (bool);, смотрите решение )
бананафиш — это был такой хабраюзер. и у него был топик, в котором он загадал загадку, у которой небыло решения. а очень много людей пыталось её решить. Вот теперь у меня всегда, когда появляется задачка, в которой на мой взгляд нет решения, всплывает в памяти тот топик.
для своих этюдов я предварительно пишу пруф код, так что надеюсь, в подобную ситуацию не попаду
Иногда индус не вы, а тот, чью библиотеку вы используете :) и в ней может быть такой вот недоделанный класс. см коммент над вами.

А занятно. Я требую продолжения!
будет обязательно )
перенесите пожалуйста пост в блог .net, тогда его увидит больше людей, поскольку посты из личных блогов не попадают на главную страницу. кармы для переноса у вас достаточно.
готово
Первый раз слышу о том, что подобные операторы можно определять в C#.
Не о всем рассказывают на лекциях.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации