具有 Ref Return Gets 的 C# 索引器也支持 Set

Posted

技术标签:

【中文标题】具有 Ref Return Gets 的 C# 索引器也支持 Set【英文标题】:C# Indexers with Ref Return Gets that also Support Sets 【发布时间】:2018-08-30 05:10:21 【问题描述】:

我在这里做错了什么,还是从 C# 7.2 开始不支持通过 ref 返回并允许设置的索引器?

作品:

public ref byte this[int index] 
  get 
      return ref bytes[index];
  

也可以:

public byte this[int index] 
  get 
      return bytes[index];
  
  set 
    bytes[index] = value;
  

失败:

public ref byte this[int index] 
  get 
      return ref bytes[index];
  
  set  //<-- CS8147 Properties which return by reference cannot have set accessors
    bytes[index] = value;
  

也失败了:

public ref byte this[int index] 
  get 
      return ref bytes[index];
  


public byte this[int index]  //<-- CS0111 Type already defines a member called 'this' with the same parameter types
  set 
    bytes[index] = value;
  

那么,有没有办法让 ref 返回但允许索引器也支持 Set?

【问题讨论】:

我猜你明白public ref byte this[int index] 允许get set 操作。类似于公共字段。 @IvanStoev 是的。但显然我不能同时拥有 Get 和 Set(如果使用 ref)。这就是我最初想做的事情。 从我之前的评论中应该很明显。一旦我从您的索引器获得ref byte,我就可以为其分配一个值,并且不会涉及任何设置器(因为我基本上有一个指向您的基础数据缓冲区的指针)。因此,拥有一个 setter 没有任何意义。 @IvanStoev 哦,是的,你是对的!我真傻!然后,您应该将其发布为我很乐意接受的答案!谢谢。 【参考方案1】:

正如@IvanStoev 正确指出的那样,不需要设置,因为该值是通过引用返回的。因此,索引器的调用者可以完全控制返回的值,因此可以为其分配一个新值,因为该值是通过引用而不是通过引用返回的,因此更改会反映在底层数据结构(其索引器被调用)中价值。

【讨论】:

以上是关于具有 Ref Return Gets 的 C# 索引器也支持 Set的主要内容,如果未能解决你的问题,请参考以下文章

C#值参数和引用参数,方法的重载,foreach,数组,以及ref和out的用法

C#笔记

java 基础(转自索宁)

sql优化

来自具有gets()的用户的输入

C#函数