C# 可以初始化范围<;T>;引用结构中的字段?

C# 可以初始化范围<;T>;引用结构中的字段?,c#,memory,struct,C#,Memory,Struct,这不起作用,因为无法直接初始化结构中的字段: public ref struct WordCollection { public Span<byte> words = stackalloc byte[100]; } public ref struct WordCollection { 公共跨距字=stackalloc字节[100]; } 错误为:“WordCollection”:结构中不能有实例属性或字段初始值设定项 但是,我

这不起作用,因为无法直接初始化结构中的字段:

public ref  struct WordCollection
    {     
        public Span<byte> words = stackalloc byte[100];
    }
public ref struct WordCollection
{     
公共跨距字=stackalloc字节[100];
}
错误为:“WordCollection”:结构中不能有实例属性或字段初始值设定项

但是,我也无法使用构造函数初始化它:

public ref  struct WordCollection
    {     
        public Span<byte> words;

        public WordCollection(int size)
        {
            words = stackalloc byte[size];
        }
    }
public ref struct WordCollection
{     
公共词汇;
公共WordCollection(整数大小)
{
字=stackalloc字节[大小];
}
}
这里的错误是:在将控件返回给调用方之前,必须完全分配字段“WordCollection.words”

这也不起作用:

public ref  struct WordCollection
    {     
        public Span<byte> words;
    }

public class Test
    {
       public static void WordProc()
        {
            WordCollection wordCollection = new WordCollection();
            wordCollection.words = stackalloc byte[100];
        } 
    }
public ref struct WordCollection
{     
公共词汇;
}
公开课考试
{
公共静态void WordProc()
{
WordCollection WordCollection=新建WordCollection();
wordCollection.words=stackalloc字节[100];
} 
}
错误是:“Span”类型的stackalloc表达式的结果无法在此上下文中使用,因为它可能在包含方法之外公开


因此,问题是:可以初始化ref结构的
Span
字段吗?

这可能不是最好的方法,但您可以将
Span
传递到构造函数中:

public ref  struct WordCollection
    {     
        public Span<byte> words;

        public WordCollection(int size)
        {
            words = stackalloc byte[size];
        }
    }
public ref struct WordCollection
{
公共词汇;
公共词集合(Span词)
{
这个单词=单词;
}
}
然后:

类程序
{
静态void Main(字符串[]参数)
{
控制台。WriteLine(“你好,世界!”);
WordCollection words=新的WordCollection(stackalloc字节[100]);
}
}

这实际上取决于您试图用它做什么…

这可能不是最好的方法,但您可以将
Span
传递给构造函数:

public ref  struct WordCollection
    {     
        public Span<byte> words;

        public WordCollection(int size)
        {
            words = stackalloc byte[size];
        }
    }
public ref struct WordCollection
{
公共词汇;
公共词集合(Span词)
{
这个单词=单词;
}
}
然后:

类程序
{
静态void Main(字符串[]参数)
{
控制台。WriteLine(“你好,世界!”);
WordCollection words=新的WordCollection(stackalloc字节[100]);
}
}

这真的取决于你想用它做什么…

我发现这很有效:

public ref  struct WordCollection
    {     
        public Span<byte> words;
    }

public class Test
    {
       public static void WordProc()
        {
            WordCollection wordCollection = new WordCollection {
                wordCollection.words = stackalloc byte[100]
            };
        } 
    }
public ref struct WordCollection
{     
公共词汇;
}
公开课考试
{
公共静态void WordProc()
{
WordCollection WordCollection=新建WordCollection{
wordCollection.words=stackalloc字节[100]
};
} 
}

这有点奇怪,不是我喜欢的方式,但能完成工作。

我发现这很有效:

public ref  struct WordCollection
    {     
        public Span<byte> words;
    }

public class Test
    {
       public static void WordProc()
        {
            WordCollection wordCollection = new WordCollection {
                wordCollection.words = stackalloc byte[100]
            };
        } 
    }
public ref struct WordCollection
{     
公共词汇;
}
公开课考试
{
公共静态void WordProc()
{
WordCollection WordCollection=新建WordCollection{
wordCollection.words=stackalloc字节[100]
};
} 
}

这有点奇怪,不是我喜欢的方式,而是完成工作的方式。

我看到的中间代码段的错误与您在这里引用的错误完全不同。
因为它可能暴露在包含方法之外。
实际上告诉您问题:在构建结构,因为它将在您返回调用方时立即消失(毕竟这是一个堆栈分配)@JonSkeet的回答是正确的,您必须从调用方方法传递
Span
。有趣的是,编译器将允许
新的WordCollection{words=stackalloc byte[100]}
,这似乎不一致。至少在对象初始值设定项的定义中,没有任何东西可以解释为什么不允许单独赋值。我看到的中间代码段的错误与您在此处引用的代码段完全不同。
,因为它可能暴露在包含方法之外。
实际上是在告诉您问题:在构造结构的任何地方都不能
stackalloc
,因为一旦返回到调用方,它就会消失(毕竟这是一个堆栈分配)@JonSkeet的回答是正确的,您必须从调用方方法传递
Span
。有趣的是,编译器将允许
newwordcollection{words=stackalloc byte[100]}
,这似乎不一致。至少,在对象初始值设定项的定义中,没有任何东西可以解释为什么在不允许单独赋值的情况下允许这样做?它被声明为
ref struct
,所以编译器知道它不会escape@Charlieface当前位置恐怕我无法理解这件事的微妙之处。我总是觉得
ref-struct
部分很难理解:(只是在想:为什么case#3不起作用?它被声明为
ref struct
,所以编译器知道它不会起作用escape@Charlieface:恐怕我无法理解这一部分的微妙之处。我总是觉得
ref-struct
部分很难理解:(这不可编译;
wordCollection.words
在初始值设定项中使用是不合法的。Just
words
是。这不可编译;
wordCollection.words
在初始值设定项中使用是不合法的。Just
words
是。