     }
     
     public subscript(_ i: Int) -> Int {
-        assert(0 <= i && i <= Self.length)
-        return indices.indices.contains(i) ? indices[i] : 0
+        if n.isFixed {
+            return indices[i]
+        } else {
+            return indices.indices.contains(i) ? indices[i] : 0
+        }
     }
     
     public static var zero: MultiIndex<n> {

    public let indices: [Int]
    
    public init(_ indices: [Int]) {
        self.indices = indices.dropLast{ $0 == 0 }
    }
    
    public init(_ indices: Int...) {

}

extension MultiIndex where n == _2 {
    public init(_ indices: (Int, Int)) {
        self.init([indices.0, indices.1])
    }
    
    public var tuple: (Int, Int) {
        (self[0], self[1])
    }
}

extension MultiIndex where n == _3 {
    public init(_ indices: (Int, Int, Int)) {
        self.init([indices.0, indices.1, indices.2])
    }
    
    public var triple: (Int, Int, Int) {
        (self[0], self[1], self[2])
    }
