Первый Нижегородский АвтоФорум (Архив)  

Вернуться   Первый Нижегородский АвтоФорум (Архив) > Форумы неавтомобильной тематики > Компьютерный
Нижегородский АвтоПортал (Архив) Справка Галереи Участники Автовзаимопомощь Календарь Поиск Сообщения за день Все разделы прочитаны

Последние сообщения с Пейджера. Показать все
За последнее время сообщений нет.
Внимание! Это архив форума.
Это архив форума и доступен в режиме "только чтение". Текущий форум находится по старому адресу www.autoforum.pro.
Компьютерный Для компьютерщиков за рулем, ну или для водил за компьютером.Обсуждения Crack'ов Keygen'ов и пиратского софта строго запрещены.

 
Опции темы Поиск в этой теме Опции просмотра
 
Старый 25-12-2011, 14:43 Бага в .NET Framework?   #1
Meteora
Матерый
Рассмотрим следующую программу:
Код:
namespace DictionaryExploit { using System; using System.Collections; using System.Collections.Generic; using System.Linq; class Program { private static void PrintDictionary(object dictionary) { if (dictionary is IDictionary) { Console.WriteLine("Dictionary is {0}", dictionary.GetType()); foreach (DictionaryEntry entry in (IDictionary)dictionary) Console.WriteLine("\t{0} => {1}", entry.Key, entry.Value); } else Console.WriteLine("The object of type {0} doesn't implement IDictionary interface.", dictionary.GetType()); } private static void PrintDictionary(IEnumerable<DictionaryEntry> dictionary) { Console.WriteLine("Dictionary represented by {0}", dictionary.GetType()); foreach (var entry in dictionary) Console.WriteLine("\t{0} => {1}", entry.Key, entry.Value); } static void Main(string[] args) { try { // Non-generic collection: OK, IDictionary is native interface. PrintDictionary(new Hashtable { { "Key 1", 1 }, { "Key 2", 2 } }); // Generic collection: OK, IDictionary is legacy interface but acts as expected according to LSP. PrintDictionary(new Dictionary<string, int> { { "Key 1", 1 }, { "Key 2", 2 } }); // LINQ: Typecast transformation of IEnumerable base of legacy IDictionary. // Expected to act exactly as above, but fails execution with InvalidCastException: // does attempt conversion from generic KeyValuePair<TKey, TValue> to DictionaryEntry. PrintDictionary( ((IDictionary)new Dictionary<string, int> { { "Key 1", 1 }, { "Key 2", 2 } }) .Cast<DictionaryEntry>() ); } catch (Exception e) { Console.WriteLine("Failed with exception: {0}", e.Message); } } } }
Компиляем, запускаем, видим вот это:
Код:
D:\Projects\DictionaryExploit\bin\Release>DictionaryExploit.exe Dictionary is System.Collections.Hashtable Key 1 => 1 Key 2 => 2 Dictionary is System.Collections.Generic.Dictionary`2[System.String,System.Int32] Key 1 => 1 Key 2 => 2 Dictionary represented by System.Linq.Enumerable+<CastIterator>d__aa`1[System.Collections.DictionaryEntry] Failed with exception: Specified cast is not valid. D:\Projects\DictionaryExploit\bin\Release>
Объясните мне пожалуйста, почему так происходит. Я что-то упустил, или это реализация Enumerable.Cast такая?
__________________
Поллитровая Мышь.
Meteora вне форума  
 
Старый 25-12-2011, 14:54   #2
wsdx
Матерый
Ты малость форумом обшибся. На винград сходи... или на ннру - там тебе быстро объяснят, что ты мудак и проститутка (ну или как там это у них, Фосс?) и вообще руки тебе надо оторвать за такой код.

Мне вот сейчас в работе и после вчерашнего вникать прям очень лениво, сорри.

p.s. Кстати, а подсветка синтаксиса в теге code двиглом форума предусмотрена или спецом прикручивали?

*Балуецца*
Код:
int i = 1 i+ = inc(i++ + ++i)

Кстати, правильный ответ на вопрос чему будет равно i после выполнения такого кода: зависит от компилятора. Проверено.
__________________
Cualquiera se puede equivocar, inclusive yo.
wsdx вне форума  
 
Старый 25-12-2011, 15:24   #3
Meteora
Матерый
Цитата:
Сообщение от wsdx
Кстати, правильный ответ на вопрос чему будет равно i после выполнения такого кода: зависит от компилятора. Проверено.
Правильный ответ -- не скомпилируется. Во-первых, "+ =" это не то же самое, что "+=" (пробелы в именах операторов не допускаются).
Во-вторых, я чё-та не вижу, что функция inc делает и где она объявлена.

Вопрос поинтересней:
Код:
i = 1; std::cout << (i+++i) << std::endl;
Вопрос: что напечатается и почему. От компилятора не зависит.
__________________
Поллитровая Мышь.
Meteora вне форума  
 
Старый 25-12-2011, 15:28   #4
wsdx
Матерый
Функция inc объявлена емнип в math. Увеличивает аргумент на единицу. Насчет пробела ты прав. Давно на сях ничего не писал - забывают руки. Да и конструкции подобные i++, ++i, += использую редко - люблю, когда код читается на раз, и все очевидно.

Что напечатается - хз. Говорю ж - с бодуна я
__________________
Cualquiera se puede equivocar, inclusive yo.
wsdx вне форума  
 
Старый 25-12-2011, 15:32   #5
Meteora
Матерый
Цитата:
Сообщение от wsdx
Функция inc объявлена емнип в math.
Окстись, мил человек. Отродясь такой функции в C не было. В Паскале была. Нельзя столько пить.
__________________
Поллитровая Мышь.
Meteora вне форума  
 
Старый 25-12-2011, 15:33   #6
wsdx
Матерый
Ничего не говори...
__________________
Cualquiera se puede equivocar, inclusive yo.
wsdx вне форума  


Здесь присутствуют: 1 (пользователей - 0 , гостей - 1)
 
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +4, время: 22:32.


vBulletin v3.5.4, Copyright ©2000-2024, Jelsoft Enterprises Ltd.
Хостинг предоставлен компанией ТТК