We recommend using Visual Studio 2017

CA1023: Indexers should not be multidimensional


The new home for Visual Studio documentation is Visual Studio 2017 Documentation on docs.microsoft.com.

The latest version of this topic can be found at CA1023: Indexers should not be multidimensional.

|Breaking Change|Breaking|

A public or protected type contains a public or protected indexer that uses more than one index.

Indexers, that is, indexed properties, should use a single index. Multi-dimensional indexers can significantly reduce the usability of the library. If the design requires multiple indexes, reconsider whether the type represents a logical data store. If not, use a method.

To fix a violation of this rule, change the design to use a lone integer or string index, or use a method instead of the indexer.

Suppress a warning from this rule only after carefully considering the need for the nonstandard indexer.

The following example shows a type, DayOfWeek03, with a multi-dimensional indexer that violates the rule. The indexer can be seen as a type of conversion and therefore is more appropriately exposed as a method. The type is redesigned in RedesignedDayOfWeek03 to satisfy the rule.

using System;

namespace DesignLibrary
    public class DayOfWeek03
        string[,] dayOfWeek = {{"Wed", "Thu", "..."}, 
                               {"Sat", "Sun", "..."}};
                               // ...

        public string this[int month, int day]
                return dayOfWeek[month - 1, day - 1];

    public class RedesignedDayOfWeek03
        string[] dayOfWeek = 
            {"Tue", "Wed", "Thu", "Fri", "Sat", "Sun", "Mon"};

        int[] daysInPreviousMonth = 
            {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30};

        public string GetDayOfWeek(int month, int day)
            return dayOfWeek[(daysInPreviousMonth[month - 1] + day) % 7];

CA1043: Use integral or string argument for indexers

CA1024: Use properties where appropriate