В частности, Roslyn
У меня есть серьезное основание полагать что я нашел ошибку в этом компиляторе, правда до конца я в этом не уверен.
Такое возможно?
Здравствуйте, vl690001x, Вы писали:
V>В частности, Roslyn V>У меня есть серьезное основание полагать что я нашел ошибку в этом компиляторе, правда до конца я в этом не уверен. V>Такое возможно?
Что значит "22/1" плюсов?
Ошибка была в моей голове.
Я добавлял объект в 1 список, потом его же в другой список.
Потом в одном списке инкрементировал поле типа int некоторых объектов из списка.
В другом списке к моему удивлению, эти объекты также менялись, но т.к. это было в разных местах, понять почему так происходит я не мог.
Привык игнорировать struct, а зря.
Слушайте, а вот эта хрень должна компилироваться? И последний 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; // Okbool bar = (array?[0]).HasValue; // Okbool 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
Упс, не, приоритет не выше, приоритет одинаковый.
Здравствуйте, alexzzzz, Вы писали:
A>Не, ну учитывая, что у оператора обращения к члену типа приоритет выше, чем у оператора ?[], оно, возможно, и не должно компилироваться. Но откуда 'int'?
Да логично всё вроде. Код разворачивается в
array == null ? null : array[0].HasValue
точно так же как
person?.Name.Length
// превращается в
person == null ? null : person.Name.Length
Почему так — долгая история, краткое изложение тут и тут. Но за человеческим объяснением — эт, разумеется, к nikov. Сам с удовольствием прочитаю
Я, кстати, наврал про Mono. Он валится ещё и на предыдущей строке:
bool bar = (array?[0]).HasValue; // error CS0266: Cannot implicitly convert type `bool?' to `bool'.
// An explicit conversion exists (are you missing a cast?)
Раз уж один баг Моно упомянул, напишу и про второй актуальный. Вот такой безобидный код мгновенно валит рантайм (только под Моно, под .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 нашёл. Только в её древней версии Моно он ещё коварнее: программа падает не сразу, а до падения просто неправильно работает — эдакое минное поле.
Здравствуйте, Sinix, Вы писали:
S>Почему так — долгая история, краткое изложение тут и тут. Но за человеческим объяснением — эт, разумеется, к nikov. Сам с удовольствием прочитаю