如果多个成员具有相同的属性,如何抛出编译器错误

简单的问题,如何强制C#编译器抛出编译错误。


更新:也许最好使用Assert.Fail()代替?

我有一个自定义属性,只应该应用于一个类的一个成员。 在我的另一个类的静态方法中,如果有多个成员应用了该属性,它会查找该成员并希望它失败(不抛出exception)。

 public class Foo { [MyCustomAttribute] public String FooString { get; set; } [MyCustomAttribute] public String OtherFooString { get; set; } } public class Bar where T : class, new() { static Bar() { //If more than one member of type Foo has MyCustomAttribute //applied to it compile error or Assert.Fail()? } } 

您可以使用诊断指令:

 #error Oops. This is an error. 

或只是警告:

 #warning This is just a warning. 

你通常想把它们放在条件块中,我希望……

编辑:好的,现在你已经更新了你的问题,你根本无法在编译时这样做。 您使用Assert.Fail建议将问题Assert.Fail为执行时间。

我建议你编写unit testing来检测它(迭代程序集中的所有类型,并检查该属性最多只应用于每种类型一次)。

编辑:在2016年…虽然OP建议的代码分析实际上不是编译器错误,但现在Visual Studio使用Roslyn,使用Roslyn代码挂钩编译器并真正从编译器获得错误是可行的分析仪。 但是,我个人更喜欢unit testing,因为这样代码可以由任何人构建和测试,无论他们是否安装了Roslyn分析器。 仍然没有办法用“纯粹的香草”C#编译器validation这一点。

在问到这个问题一年之后,我意识到了unit testing的另一种解决方案:代码分析。

如果不存在代码分析规则,您甚至可以自己滚动 。 只需确保将规则设置为错误而不是警告(或确保将警告视为错误)。 这是该屏幕的图像:

代码分析错误

当然,我仍然倾向于在这种特殊情况下使用unit testing,但我绝对可以看到代码分析作为替代解决方案,特别是对于自定义命名等事情(即我的所有类都应以’Foo’结尾或抛出错误)。

简单回答:要求它编译语法无效的东西。

我不相信这可以做到,因为无法告诉编译器检查自定义错误。 当然,你可以像Jon说的那样使用#error,但是没有办法自己添加条件。 因为#error每次都会导致错误。

您唯一可以确定的是在运行时检查然后抛出exception。

编辑:该死的,经过大量编辑后开始质疑。