自定义编译时检查

我不认为这个问题已经(或可以)得到解答,或者至少我没有找到答案:是否可以创建自定义编译时检查?

具体情况是我正在编程量子空间计算器,虽然你可以有向量(1,0,0)和(1,0),但我应该修改它们之间的某些操作,因为它们属于某些空格。 更重要的是,你可以拥有(1,0)和(1,0),但它们都不属于相同的空间,因此它们之间的操作会有所不同。 但是我找不到一个聪明的(不是运行时)方法来做这个,因为它们都属于同一个类,所以它们有相同的运算符!

另外,向量的大小是任意的(从0到无穷大)所以我不能把它们作为“元组”的所有类。

您可以尝试使用generics来防止不同“向量”类之间的操作,如下面的概念代码:

class Vector : IEnumerable { public static Vector operator + (Vector left, Vector right) { ... } } var v1 = new Vector(2); var v2 = new Vector(2); var r = v1 + v2; // should fail. 

Traits类作为样本中的generics参数仅用于区分double不同向量,但在实际情况下甚至可以很好地使用此类)

您可以使用代码约定来描述有关类允许的类状态和操作的非平凡假设。 某些合同可以在编译时检查,其他合同将生成运行时exception。

可能你想看unit testing。 不编译时间,但对您的鳕鱼进行运行前检查。 在unit testing中,您将指定代码应处理的约束。 如果开发人员破坏了这些约束,unit testing将失败,突出显示问题。

人们在unit testing上写书,所以不能真正写出很多关于它们的书,但你可以从这里开始: http : //anthonyjbrown.blogspot.co.uk/2012/06/true-beginners-guide-to-unit -testing-in.html

正如我在评论中已经提到的,我认为这里的建模问题比编译时间检查的实际问题要多。

但是,正如你所问,这些检查可以通过利用postharp之类的东西来实现。

使用Postsharp作为入门者的面向方面编程的Codeproject文章