编程小知识之 C# indexer 和 property

本文简单介绍了混合使用 C# indexer 和 property 时可能出现的一种意外错误

C# 中的 property 想必大家都很熟悉,比起传统的 get 和 set 函数, property 的一大优势就是可以简化代码:

public class PropertyClass
{
	public string Item { get; set; }
}

不过 C# 中的 indexer 可能乍看上去就有些陌生了,基本的定义方法如下:

public class IndexerClass
{
    public object this[int index] { get { return null; } set {} }
}

这种定义方式对于偏于数组或者矩阵形式的数据类型特别有用,例如 Unity 中的 Matrix4x4 便定义了一个二维的indexer(Matrix4x4也定义了一维版本的indexer),用以提供直观的数据访问方式:

// indexer of UnityEngine.Matrix4x4
public float this[int row, int column]
{
	get
	{
		return this[row + column * 4];
	}
	set
	{
		this[row + column * 4] = value;
	}
}

不过令人有些意外的是,如果我们混合使用上述的 indexer 和 property,竟然会导致编译错误:

// compile error ...
public class MixClass
{
	public string Item { get; set; }
	public object this[int index] { get { return null; } set {} }
}

原因在于 C# 使用了类似 property 的方式实现了 indexer,并且 indexer 所对应的 property 的变量名便是 “Item”, 所以上述代码会被编译器改写为以下形式(不准确,仅作示意):

public class MixClass
{
	public string Item { get; set; }
	public object Item { get { return null; } set {} }
}

于是同名的 property 便造成了编译错误.

解决方法大概有两种,修改 property 的名字(不要以 “Item” 命名),或者修改 indexer 的名字,其中 indexer 名字的修改需要用到属性:

public class MixClass
{
	public string Item { get; set; }
	[System.Runtime.CompilerServices.IndexerName("IndexerItem")]
	public object this[int index] { get { return null; } set {} }
}
参考
  1. class with indexer and property named “Item”
  2. item property in c#
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值