Generic Extension Method Ambiguity

后端 未结 6 1560
说谎
说谎 2020-12-09 11:34

I have two interfaces defined:

// IVector.cs
public interface IVector
{
    int Size { get; }

    float this[int index] { get; set; }
}

// IMatrix.cs
publi         


        
6条回答
  •  既然无缘
    2020-12-09 12:14

    Found my own answer again (and it's a bit of a hack):

    // IVector.cs
    public interface IVector
        where T : IVector
    {
        int Size { get; }
    
        float this[int index] { get; set; }
    }
    
    // IMatrix.cs
    public interface IMatrix
        where T : IMatrix
    {
        int Size { get; }
    
        float this[int row, int column] { get; set; }
    }
    
    // VectorExtensions.cs
    public T Add(this IVector vector, T value)
        where T : struct, IVector
    {
        var output = default(T);
    
        for (int i = 0; i < output.Size; i++)
            output[i] = vector[i] + value[i];
    
        return output;
    }
    
    // MatrixExtensions.cs
    public static T Add(this IMatrix matrix, T value)
        where T : struct, IMatrix
    {
        var output = default(T);
    
        for (int i = 0; i < output.Size; i++)
            for (int j = 0; j < output.Size; j++)
                output[i, j] = vector[i, j] + value[i, j];
    
        return output;
    }
    

    It works beautifully. Hooray for CRTP :D

提交回复
热议问题