首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么不能将“`stackalloc`”表达式分配给`Span<T>`参数?

为什么不能将“`stackalloc`”表达式分配给`Span<T>`参数?
EN

Stack Overflow用户
提问于 2021-04-28 11:59:00
回答 1查看 232关注 0票数 4

考虑以下方法(小提琴):

代码语言:javascript
复制
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中的返回值如何转义该方法的作用域?

EN

回答 1

Stack Overflow用户

发布于 2021-04-28 13:43:21

Sinatr在评论中发布了一个链接(在这里相关的部分),帮助我将整个代码放在跨径安全的上下文中。

在方法test中,参数param是安全的返回,因为我们可以假装它是一个局部变量,初始化时调用者给出的值(因此,在方法的外部,安全返回)。

当一个本地值被标记为安全返回时,编译器将防止使用不安全返回的值分配给它(显然,stackalloc表达式可以安全地转义到方法的顶部范围,但不安全返回)。

方法是空的这一事实并不重要(对我来说也不重要,对编译器也不重要),因为这条规则是通用的(我不认为处理这些角落案例有多大好处)。

为了完整起见,此代码不编译:

代码语言:javascript
复制
void test2(Span<int> param)
{
    //Fail, because local is marked safe to return
    Span<int> local = param;
    local = stackalloc int[10];
}

这是我要找的那件丢失的东西。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67299825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档