Здравствуйте, Shmj, Вы писали:
S>Что выведет прога?
На dotnet 6 не собирается: "error CS8352: Cannot use local 'span' in this context because it may expose referenced variables outside of their declaration scope"
Здравствуйте, Shmj, Вы писали:
S>Просто, имхо, поведение не очевидно. Откуда компиллер знает что в Span...
Видит.
S>... и какая ему разница?
Чтобы предупреждать об ошибках.
Да пофиг, что она выведет! Это априори левый код. Брать всякое гогно и пытаться делать из собеседуемого "компилятор сишарп" — тупее конторы не найти! Ты не должен отвечать за чужой код, ты должен писать свой.
А для всяких ребусов — опять же, есть Рихтер, но эти "закавыки" вообще никак к интервью не относятся.
Здравствуйте, Kolesiki, Вы писали:
S>>Что выведет прога?
K>Да пофиг, что она выведет! Это априори левый код. Брать всякое гогно и пытаться делать из собеседуемого "компилятор сишарп" — тупее конторы не найти! Ты не должен отвечать за чужой код, ты должен писать свой. K>А для всяких ребусов — опять же, есть Рихтер, но эти "закавыки" вообще никак к интервью не относятся.
Тут с первого взгляда на код видно, что так делать нельзя. По идее, ты об этом сразу так и скажешь. А если нет, то вдруг сам будешь пытаться такое писать в ожидании чуда. Ну нафиг.
Здравствуйте, Kolesiki, Вы писали:
K>Да пофиг, что она выведет! Это априори левый код. Брать всякое гогно и пытаться делать из собеседуемого "компилятор сишарп" — тупее конторы не найти! Ты не должен отвечать за чужой код, ты должен писать свой.
Ну тут не совсем ребус. Стек — это таки базовое понятие и если чел. примерно знает как стек работает — то уже плюс.
Я вот когда увидел возможность использовать stackalloc у управляемом коде — сразу задался вопросом — а что же будет, если ссылку на стековою переменную передать за пределы стека? Думал получить stack fault exception — а тут фиг тебе, компиллер проверяет что хранится в Span.
S>Я вот когда увидел возможность использовать stackalloc у управляемом коде — сразу задался вопросом — а что же будет, если ссылку на стековою переменную передать за пределы стека? Думал получить stack fault exception — а тут фиг тебе, компиллер проверяет что хранится в Span.
Он не проверяет, что хранится в Span. Он просто отмечает небезопасную инициализацию.
Так тоже не пройдёт, хотя по сути это безопасно. Но если убрать первую инициализацию span, то будет работать.
using System;
var array = Fun1();
Console.WriteLine(array[0]);
Span<byte> Fun1()
{
Span<byte> span = stackalloc byte[200];
var arr = new byte[200];
span = arr;
span[0] = 1;
return span;
}
Здравствуйте, Shmj, Вы писали:
S>Я вот когда увидел возможность использовать stackalloc у управляемом коде — сразу задался вопросом — а что же будет, если ссылку на стековою переменную передать за пределы стека? Думал получить stack fault exception — а тут фиг тебе, компиллер проверяет что хранится в Span.
Ну без unsafe он кроме как в Span никуда и не даст записать. Так задумано.