AVK Selected
Показавшиеся интересными, на мой вкус, посты
[Этюд, C#] Ненужный null
23.12.2013
|
nikov |
Это загадка, которую я недавно публиковал на Twitter и давал коллегам на работе. Пока что её отгадал только один человек — Mads Torgersen (причём почти сразу).
Напишите валидную C# программу, которая содержит следующую последовательность токенов:
и которая остаётся валидной, если мы уберём токен null из этой последовательности, т.е. оставим
Напишите валидную C# программу, которая содержит следующую последовательность токенов:
? null :
и которая остаётся валидной, если мы уберём токен null из этой последовательности, т.е. оставим
? :
Пояснения | |
* Валидная программа — это программа, которая компилируется без ошибок. Она может быть как приложением (.exe), так и библиотекой классов (.dll). * Комментарии, части строковых литералов, имена регионов, текст в пропущенных секциях (#if false) и т.д. не являются токенами. * Части токенов не являются токенами (например, символ `:` в выражении `foo::bar` или `?` в выражении `foo ?? bar` не являются токенами) * Runtime поведение программы несущественно. То, что оно может измениться при удалении токена null, также несущественно. | |
23.12.2013 23 комментария |
N>Это загадка, которую я недавно публиковал на Twitter и давал коллегам на работе. Пока что её отгадал только один человек — Mads Torgersen (причём почти сразу).
N>Напишите валидную C# программу, которая содержит следующую последовательность токенов:
N>и которая остаётся валидной, если мы уберём токен null из этой последовательности, т.е. оставим
N>
N>* Комментарии, части строковых литералов, имена регионов, текст в пропущенных секциях (#if false) и т.д. не являются токенами.
N>* Части токенов не являются токенами (например, символ `:` в выражении `foo::bar` или `?` в выражении `foo ?? bar` не являются токенами)
N>* Runtime поведение программы несущественно. То, что оно может измениться при удалении токена null, также несущественно.
так? или я условия неправильно понял?
I>так? или я условия неправильно понял?
I>
В исходной программе должны быть три токена
следующих один за другим. Между ними не должны присутствовать какие-либо другие токены.
N>Напишите валидную C# программу, которая содержит следующую последовательность токенов:
N>и которая остаётся валидной, если мы уберём токен null из этой последовательности, т.е. оставим
Добавлять/удалять другие слова вне этой последовательности токенов можно?
_>Добавлять/удалять другие слова вне этой последовательности токенов можно?
Нет.
N>Это загадка, которую я недавно публиковал на Twitter и давал коллегам на работе. Пока что её отгадал только один человек — Mads Torgersen (причём почти сразу).
N>Напишите валидную C# программу, которая содержит следующую последовательность токенов:
N>и которая остаётся валидной, если мы уберём токен null из этой последовательности, т.е. оставим
Пока что у меня проблема даже с тем, чтобы хотя бы написать валидную программу с последовательностью токенов ? :.
Прошерстил спеку C# 5.0. Colon можно использовать в:
1. Тернарном операторе: не подходит, между ? и : должен быть expression
2. Указателе базового класса: не подходит, слева от : будет либо идентификатор, либо идентификатор <параметры>
3. Label: не подходит, слева от : должен быть идентификатор
4. Case label: не подходит, слева от : должно быть constant expression
5. Декларации атрибута: не подходит, слева от : будет одно из предопределённых ключевых слов
6. Указании именованного параметра в вызове функции: не подходит, слева от : должен быть идентификатор
7. Указании constraint на параметр типа: не подходит, слева от : должен быть идентификатор
8. Декларации конструктора, для обращения к base(...) или this(...): не подходит, слева от : будет )
9. Декларации enum для указания интегрального базового типа: не походит, слева от : должен быть идентификатор
10. В doc comments, но их мы вроде бы не рассматриваем.
Вроде всё.
S>Пока что у меня проблема даже с тем, чтобы хотя бы написать валидную программу с последовательностью токенов ? :.
Это-то не проблема:
А вот как обойтись _только_ удалением null —
_>А вот как обойтись _только_ удалением null —
Так вы же уже написали ответ:
Ведь bool к bool? приводится автоматически.
S>Так вы же уже написали ответ:
nikov, это ответ?
_>nikov, это ответ?
_>
Конечно, нет. Это даже не валидная программа на C#.
_>static bool? Test2()
_>{
_> return true ? o is bool
_> ? :
_> false;
_>}
_>[/c#]
а как это воспринимает компилятор? почему компилит?
А>а как это воспринимает компилятор? почему компилит?
А>почему компилит?
Потому что код валидный, но из-за форматирования тут обман зрения. (там bool?
S>Прошерстил спеку C# 5.0. Colon можно использовать в:
если про 6, то там, говорят, еще такое будет:
т.е. в этом случае вопрос может относиться к проверке на null. Тогда something? может быть первым выражением перед двоеточием в тернарном операторе.
N>если про 6, то там, говорят, еще такое будет:
N>
Это пока что далеко не финальный синтаксис и может еще 100 раз поменяться.
Это не совсем честно, поскольку изменение заключается не только в удалении токена null, но и еще одного выражения
ST>Это не совсем честно, поскольку изменение заключается не только в удалении токена null, но и еще одного выражения
Кроме удаления null ничего больше менять нельзя.
Развлекаетесь?
Какие ещё есть конструкции, заканчивающиеся на '?' кроме предиката is? Очевидно лямбда, заканчивающаяся предикатом is.
N>Напишите валидную C# программу, которая содержит следующую последовательность токенов:
N>и которая остаётся валидной, если мы уберём токен null из этой последовательности, т.е. оставим
Ну, почти...
Осталось понять, почему без выделенного перестает компилиться. Кто поможет?
_>Осталось понять, почему без выделенного перестает компилиться. Кто поможет?
Стоп! Оно же скомпилировалось!! Voila!!!
_>Стоп! Оно же скомпилировалось!! Voila!!!
_>
Точно!
N>Точно!
М-да. Решарпер при подобных экспериментах, конечно, стоит отключать...
И еще интересно, зачем компилятор позволяет делать такое:
_>И еще интересно, зачем компилятор позволяет делать такое:
_>
Видимо, потому что вместо null может быть более сложный инициализатор (вызов метода, например), который может вернуть как null, так и значение, которое в конце нужно будет освободить с помощью Dispose. Точно так же, как и с ссылочными типами.
N>Видимо, потому что вместо null может быть более сложный инициализатор (вызов метода, например), который может вернуть как null, так и значение, которое в конце нужно будет освободить с помощью Dispose. Точно так же, как и с ссылочными типами.
И правда. Оказывается, можно написать как-то так:
и оно не упадет.