Ilya
вот для таких случаев
Doge
потому что ты явно пишешь
Я буквально тебе говорю сейчас то, что написано в комментах в компиляторе Вот один в один. Что у них там специальный кодген для структур, чтобы не было боксинга: // First: if the type is a non-nullable value type then we do not do the // *boxing conversion* from the resource to IDisposable. Rather, we do // a *constrained virtual call* that elides the boxing if possible.
Ilya
не вижу в это ничего предрассудительного
Ilya
не вижу, чтобы это нарушало спеку
Doge
да, так и есть и это обычный IL код
Это не обычный IL код для этого кейса, это один специальный кейс, который не распространяется на другие случаи структура + каст в интерфейс + вызов метода.
Doge
Как было показано выше
Ilya
Как было показано выше
https://sharplab.io/#v2:C4LglgNgPgAgTARgLACgYAYAEMEDoAyYAdgI4DcqG2CALBWgMzZyYDCmA3qpj9kzDUwBZBAAoAlFxS8ZVUUQCmAd0wBBCZIC+3Xtum8dPGPxZqQmAJIARMAGcADgHtbAQwBGEBYc7eZ2QdZ2Tq4eCrg2Ds4KEhx6MnE8qJpAA===
Ilya
ты для классов видишь каст?
Roman
@omgszer а твой GiraffeGenerator умеет спеку из жсона читать? Или только ямл нужен?
Doge
ты для классов видишь каст?
Речь про структуры всё это время был, причём тут классы
Ayrat
мне вот кажется что внезапно сможет
Ayrat
я ее не сам паршу
Ayrat
а через либу
Ilya
Речь про структуры всё это время был, причём тут классы
речь оригинально шла про боксинг структур в using (которого нет), а потом перешла на компилятор
Ayrat
я просто чот не думал что кто-то жсоном опенапи описывает
Roman
хороший вопрос!!11
а то я добавил спеку жсон, добавил Generated.fs пустой, сбилдил и нихуя. Generated.fs так и остался с декларейшном модуля и нихуями
Roman
я просто чот не думал что кто-то жсоном опенапи описывает
у меня любопытный кейс: я беру чужой сваггер.жсон чтобы сделать стаб для тестов
Doge
речь оригинально шла про боксинг структур в using (которого нет), а потом перешла на компилятор
Которого нет - потому что в компиляторе специальная затычка для этого конкретного случая using + структура сделан, чтобы генерить не box + callvirt, а constrained + callvirt О чём тут и говорили
Ilya
и это?
Doge
это тоже хак?
А где тут каст?
Ayrat
https://github.com/microsoft/OpenAPI.NET вот эта хуита говорит что ямлы и жсоны парсит. и ей пофигу, она строку и стрим в одном и том же апи жрет
Doge
и это?
Речь про хак в конкретном случае: cast структуры в интерфейс и вызов метода на ней
Doge
Мы говорим только про этот случай
Roman
я ща проверю, но чот кажется что должно работать
generated.fs надо физически создать же? И если да, он должен быть пустой или похуй?
Ilya
Речь про хак в конкретном случае: cast структуры в интерфейс и вызов метода на ней
это не хак, так вызываются ВСЕ полиморфные методы у структур
Roman
не, ничего не надо
просто в файл проекта добавить хмл из примера?
Ilya
в том числе GetHashCode и ToString
Doge
в том числе GetHashCode и ToString
Оно причём тут? Мы говорим про случай с кастом. Причём тут случаи без каста в интерфейс?
Doge
Конкретно про код вида: ((IMyInterface)myStruct).MyMethod()
Doge
Любой другой код к этому спору отношение не имеет
Ilya
Оно причём тут? Мы говорим про случай с кастом. Причём тут случаи без каста в интерфейс?
1. где ты нашел, что должен быть каст в реализации using + IDidsposable?
Doge
1. где ты нашел, что должен быть каст в реализации using + IDidsposable?
Так написано в спеке: // SPEC: When ResourceType is a non-nullable value type, the expansion is: // SPEC: // SPEC: { // SPEC: ResourceType resource = expr; // SPEC: try { statement; } // SPEC: finally { ((IDisposable)resource).Dispose(); } // SPEC: } // SPEC:
Ilya
а не вызов явной имплементации
Крылатый
Tako
@VagifAbilov Я вижу у вас там умеют отдыхать получше нашего https://youtu.be/EF1V8HFfpTE
Doge
почему ты решил, что ((IDisposable)resource).Dispose(); это каст?
Потому что если я напишу такой код, то я получу именно каст в интерфейс в любом случае для структуры: https://sharplab.io/#v2:C4LglgNgNAJiDUAfAAgJgIwFgBQyAMABMugHQAyYAdgI4DcO+R6ALPbgMxGoEDCBA3jgLCinZMwIBZdAAoAlIOwjlBGTICSAETABnAA4B7HQEMARhACmcyhYDuBAILy5JbfqMX5tAkJEBfX2FA0SIJSVR5RRURNS1dQxNzKxt7ACFnV3iPLx8lf2CcYOROHWAAJwBXAGNgRxACOPdEy2Co6JDxAjcEzwUAvOF+5SKS8ura1PrGhLMWgYFg5U7po1mLTKbegSH8gZw/IA Что для явной, что для обычной реализации
Ilya
Потому что если я напишу такой код, то я получу именно каст в интерфейс в любом случае для структуры: https://sharplab.io/#v2:C4LglgNgNAJiDUAfAAgJgIwFgBQyAMABMugHQAyYAdgI4DcO+R6ALPbgMxGoEDCBA3jgLCinZMwIBZdAAoAlIOwjlBGTICSAETABnAA4B7HQEMARhACmcyhYDuBAILy5JbfqMX5tAkJEBfX2FA0SIJSVR5RRURNS1dQxNzKxt7ACFnV3iPLx8lf2CcYOROHWAAJwBXAGNgRxACOPdEy2Co6JDxAjcEzwUAvOF+5SKS8ura1PrGhLMWgYFg5U7po1mLTKbegSH8gZw/IA Что для явной, что для обычной реализации
If the form of resource-acquisition is local-variable-declaration then the type of the local-variable-declaration must be System.IDisposable or a type that can be implicitly converted to System.IDisposable. If the form of resource-acquisition is expression then this expression must be of type System.IDisposable or a type that can be implicitly converted to System.IDisposable.
Ayrat
generated.fs надо физически создать же? И если да, он должен быть пустой или похуй?
я думаю там все ж багуля, я посмотрю когда закончу интервью сегодня
Ilya
страница 249
Ilya
описано поведение для структур и классов ОТДЕЛЬНО
Ayrat
кстати мы щас интервьюируем в даблин даже из Индии
Ayrat
это я к тому что из РФ тоже
Ayrat
вам просто надо поаплаиться -_-
Doge
страница 249
Точно 249?
Ilya
поиском может будет проще найти
Doge
А, у меня опен офис по другому отобразил
Doge
описано поведение для структур и классов ОТДЕЛЬНО
Да, и оно ровно то, что указано в тех исходниках: { ResourceType resource = expression; try { statement; } finally { ((IDisposable)resource).Dispose(); } } как спека
Doge
И включает в себя каст
Doge
Потому что с точки зрения конструкций языка - это именно что каст.
Doge
Что и показывает себя в том, как ведет подобный код себя в реальности (вне зависимо от явной или неявной реализации): https://sharplab.io/#v2:C4LglgNgNAJiDUAfAAgJgIwFgBQyAMABMugHQAyYAdgI4DcO+R6ALPbgMxGoEDCBA3jgLCinZMwIBZdAAoAlIOwjlBGTICSAETABnAA4B7HQEMARhACmcyhYDuBAILy5JbfqMX5tAkJEBfX2FA0SIJSVR5RRURNS1dQxNzKxt7ACFnV3iPLx8lf2CcYOROHWAAJwBXAGNgRxACOPdEy2Co6JDxAjcEzwUAvOF+5SKS8ura1PrGhLMWgYFg5U7po1mLTKbegSH8gZw/IA
Ilya
Потому что с точки зрения конструкций языка - это именно что каст.
неправда, явное приведение имеет такой же синтаксис
Doge
неправда, явное приведение имеет такой же синтаксис
Они неразличимы с точки зрения подобной записи.
Doge
И да, в комментарии разработчики языка явно говорят, что отсутствием бокса спецификацию они нарушают
Ilya
Они неразличимы с точки зрения подобной записи.
но есть текстовое описание, которое говорит,что local-variable-declaration must be System.IDisposable or a type that can be implicitly converted to System.IDisposable
Doge
И да, в комментарии разработчики языка явно говорят, что отсутствием бокса спецификацию они нарушают
// First: if the type is a non-nullable value type then we do not do the // *boxing conversion* from the resource to IDisposable. Rather, we do // a *constrained virtual call* that elides the boxing if possible. // // Now, you might wonder if that is legal; isn't skipping the boxing producing // an observable difference?
Doge
Они сами в компиляторе понимают, что отступают от спеки в данном случае
Ayrat
то есть тебя захотят релоцировать
Ayrat
скорее всего
Stas
вам просто надо поаплаиться -_-
мы не умеем в кодинг на доске)
Ayrat
но в МС вроде объявили вечную удаленку
Tako
релокейт и удаленку
Прикольно.А чтобы зааплаиться просто на сайт резюме прислать или как?
Ilya
Они сами в компиляторе понимают, что отступают от спеки в данном случае
они пишут, что для структур, они использую не box инструкцию, которая копирует в кучу структуру, а constrained которая позволяет сделать полиморфный вызов для структур
Ayrat
мы не умеем в кодинг на доске)
я тоже не умею, никогда не кодил на доске