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