It feels like you're conflating the Identifier for the `Channel` with its position within a `ChannelSet`. The following is my visualisation of how your code/comments would look at the moment : public sealed class ChannelSet { private Channel[] channels; /// <summary>Retrieves the specified channel</summary> /// <param name="channelId">The id of the channel to return</param> Channel GetChannel(int channelId) { return channels[channelId-1]; } } It does feel like you've *decided* that because `Channel`s within a `ChannelSet` are identified by numbers that have an upper and lower bound they must be indexes and therefore as it's C#, 0 based. If the natural way to refer to each of the channels is by a number between 1 and X, refer to them by a number between 1 and X. Don't try and force them into being indexes. If you really want to provide a way to access them by 0 based index (what benefit does this give your end user, or developers that consume the code?) then implement an [Indexer][1]: public sealed class ChannelSet { private Channel[] channels; /// <summary>Retrieves the specified channel</summary> /// <param name="channelId">The id of the channel to return</param> public Channel GetChannel(int channelId) { return channels[channelId-1]; } /// <summary>Return the channel at the specified index</summary> public Channel this[int index] { return channels[index]; } } [1]: http://stackoverflow.com/a/2185184/7872