考虑以下方法(小提琴):
void test(Span<int> param)
{
//Fail, the stackalloc'ed buffer could be exposed.
param = stackalloc int[10];
}
void test2(Span<int> param)
{
//OK
Span<int> local = stackalloc int[10];
}我不明白为什么param = stackalloc int[10];会产生错误:
不能在此上下文中使用“Span”类型的
stackalloc表达式的结果,因为它可能暴露在包含方法之外。
Span是一个ref struct,但是(尽管它的名称)它仍然是一个值类型,所以对param的任何修改都不会反映在调用者对象上。
我认为param是一个具有初始值的局部变量,我不明白为什么test2编译而test不编译。
stackalloc int[10]在test中的返回值如何转义该方法的作用域?
发布于 2021-04-28 13:43:21
Sinatr在评论中发布了一个链接(在这里相关的部分),帮助我将整个代码放在跨径安全的上下文中。
在方法test中,参数param是安全的返回,因为我们可以假装它是一个局部变量,初始化时调用者给出的值(因此,在方法的外部,安全返回)。
当一个本地值被标记为安全返回时,编译器将防止使用不安全返回的值分配给它(显然,stackalloc表达式可以安全地转义到方法的顶部范围,但不安全返回)。
方法是空的这一事实并不重要(对我来说也不重要,对编译器也不重要),因为这条规则是通用的(我不认为处理这些角落案例有多大好处)。
为了完整起见,此代码不编译:
void test2(Span<int> param)
{
//Fail, because local is marked safe to return
Span<int> local = param;
local = stackalloc int[10];
}这是我要找的那件丢失的东西。
https://stackoverflow.com/questions/67299825
复制相似问题