Ошибки в компиляторах
От: vl690001x Россия  
Дата: 27.08.16 03:22
Оценка: 22 (1)
В частности, Roslyn
У меня есть серьезное основание полагать что я нашел ошибку в этом компиляторе, правда до конца я в этом не уверен.
Такое возможно?
Re: Ошибки в компиляторах
От: nikov США http://www.linkedin.com/in/nikov
Дата: 27.08.16 03:30
Оценка:
Здравствуйте, vl690001x, Вы писали:

V>В частности, Roslyn

V>У меня есть серьезное основание полагать что я нашел ошибку в этом компиляторе, правда до конца я в этом не уверен.
V>Такое возможно?

Конечно, возможно. Какая ошибка?
Re: Ошибки в компиляторах
От: vl690001x Россия  
Дата: 27.08.16 12:45
Оценка: :))) :))
Что значит "22/1" плюсов?
Ошибка была в моей голове.
Я добавлял объект в 1 список, потом его же в другой список.
Потом в одном списке инкрементировал поле типа int некоторых объектов из списка.
В другом списке к моему удивлению, эти объекты также менялись, но т.к. это было в разных местах, понять почему так происходит я не мог.
Привык игнорировать struct, а зря.
Re[2]: Ошибки в компиляторах
От: alexzzzz  
Дата: 29.08.16 13:23
Оценка:
Здравствуйте, vl690001x, Вы писали:

Ошибки в компиляторе — запросто. В Рослине не находил, а в Моно находил две в компиляторе C# и одну в рантайме, вероятно в JIT'е.
Re: Ошибки в компиляторах
От: Mihas  
Дата: 29.08.16 13:38
Оценка:
Здравствуйте, vl690001x, Вы писали:

V>Такое возможно?

Я пару ошибок в библиотеках дотнета нашел. Наверное, и в компилятор могли просочиться.
Re: Ошибки в компиляторах
От: alexzzzz  
Дата: 29.08.16 17:47
Оценка:
Слушайте, а вот эта хрень должна компилироваться? И последний Roslyn, и последний Mono дают ошибку. Где они там в последней строке находят 'int'?

public static class Program
{
    public static void Main()
    {
        var array = new[] { 0, 1, 2, 3 };

        int? item = array?[0];
        bool foo = item.HasValue; // Ok

        bool bar = (array?[0]).HasValue; // Ok

        bool baz = array?[0].HasValue; // Error CS1061
        // 'int' does not contain a definition for 'HasValue' and
        // no extension method 'HasValue' accepting a first argument
        // of type 'int' could be found(are you missing a using directive
        // or an assembly reference ?)
    }
}


Не, ну учитывая, что у оператора обращения к члену типа приоритет выше, чем у оператора ?[], оно, возможно, и не должно компилироваться. Но откуда 'int'?

PS
Упс, не, приоритет не выше, приоритет одинаковый.
Отредактировано 29.08.2016 23:15 alexzzzz . Предыдущая версия . Еще …
Отредактировано 29.08.2016 17:55 alexzzzz . Предыдущая версия .
Re[2]: Ошибки в компиляторах
От: Sinix  
Дата: 29.08.16 18:11
Оценка: 4 (1)
Здравствуйте, alexzzzz, Вы писали:

A>Не, ну учитывая, что у оператора обращения к члену типа приоритет выше, чем у оператора ?[], оно, возможно, и не должно компилироваться. Но откуда 'int'?

Да логично всё вроде. Код разворачивается в
 array == null ? null : array[0].HasValue


точно так же как
person?.Name.Length 
// превращается в 
person == null ? null : person.Name.Length


Почему так — долгая история, краткое изложение тут и тут. Но за человеческим объяснением — эт, разумеется, к nikov. Сам с удовольствием прочитаю
Отредактировано 29.08.2016 18:19 Sinix . Предыдущая версия .
Re[3]: Ошибки в компиляторах
От: alexzzzz  
Дата: 29.08.16 18:22
Оценка: 22 (1)
Здравствуйте, Sinix, Вы писали:

S>
S> array == null ? null : array[0].HasValue
S>

Да, теперь логично.

Я, кстати, наврал про Mono. Он валится ещё и на предыдущей строке:

bool bar = (array?[0]).HasValue; // error CS0266: Cannot implicitly convert type `bool?' to `bool'.
                                 // An explicit conversion exists (are you missing a cast?)

Вот это я так и не понял.
Re[4]: Ошибки в компиляторах
От: alexzzzz  
Дата: 29.08.16 20:08
Оценка: 71 (3)
Здравствуйте, alexzzzz, Вы писали:

Раз уж один баг Моно упомянул, напишу и про второй актуальный. Вот такой безобидный код мгновенно валит рантайм (только под Моно, под .Net всё работает):

struct Foo
{
    Foo[][] foo; // двумерный (или более) рваный массив элементов типа Foo, статический или экземплярный - пофиг
}

static class Test
{
    static void Main()
    {
        new Foo();
    }
}


Invalid type Foo[][] for instance field Foo:foo

Unhandled Exception:
System.TypeLoadException: Could not load type 'Foo' from assembly 'Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'.
[ERROR] FATAL UNHANDLED EXCEPTION: System.TypeLoadException: Could not load type 'Foo' from assembly 'Test, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'.


Я это баг в Unity нашёл. Только в её древней версии Моно он ещё коварнее: программа падает не сразу, а до падения просто неправильно работает — эдакое минное поле.
Re[3]: Ошибки в компиляторах
От: nikov США http://www.linkedin.com/in/nikov
Дата: 10.09.16 04:28
Оценка: 22 (1)
Здравствуйте, Sinix, Вы писали:

S>Почему так — долгая история, краткое изложение тут и тут. Но за человеческим объяснением — эт, разумеется, к nikov. Сам с удовольствием прочитаю


Я здесь
Автор: _NN_
Дата: 16.06.14
кое-что писал на эту тему.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.