通过滥用 c# 中的类型系统,我可以创建代码,编译器将在其中强制执行规则,以确保不执行不可能的操作。在下面的代码中,它特定于矩阵乘法。
显然,下面的内容是完全不切实际/错误的,但是有什么原因我们将来不能在 c# 中使用这样的东西,我可以在其中定义像 Matrix<2,2> 这样的类型并让编译器确保安全?
此外,任何主流语言中都存在这样的东西吗?我怀疑在 C++ 中进行元编程可能会发生这样的事情?
public abstract class MatrixDimension { }
public class One : MatrixDimension { }
public class Two : MatrixDimension { }
public class Three : MatrixDimension { }
public class Matrix<TRow, TCol>
where TRow : MatrixDimension
where TCol : MatrixDimension
{
// matrix mult. rule. N×M * M×P = N×P
public Matrix<TRow, T_RHSCol> Mult<T_RHSCol>(Matrix<TCol, T_RHSCol> rhs)
where T_RHSCol : MatrixDimension
{ return null;}
}
public class TwoByTwo : Matrix<Two, Two> { }
public void Main()
{
var twoByTwo = new Matrix<Two, Two>();
var oneByTwo = new Matrix<One, Two>();
var twoByThree = new Matrix<Two, Three>();
var threeByTwo = new Matrix<Three, Two>();
var _twoByTwo = new TwoByTwo();
var _2x2 = twoByTwo.Mult(twoByTwo);
var _1x2 = oneByTwo.Mult(twoByTwo);
var _3x3 = twoByThree.Mult(threeByTwo);
var _2x2_ = _twoByTwo.Mult(twoByTwo);
var invalid = twoByThree.Mult(twoByThree); // compile fails, as expected
}