简单的问题,如何强制C#编译器抛出编译错误。
更新:或许最好使用Assert.Fail()
?
我有一个自定义属性,只能应用于一个类的一个成员。在我的另一个类'静态方法中,它查找那个成员,如果有多个成员应用了该属性,我希望它失败(不抛出异常)。
public class Foo
{
[MyCustomAttribute]
public String FooString { get; set; }
[MyCustomAttribute]
public String OtherFooString { get; set; }
}
public class Bar<T>
where T : class, new()
{
static Bar()
{
//If more than one member of type Foo has MyCustomAttribute
//applied to it compile error or Assert.Fail()?
}
}
答案 0 :(得分:26)
您可以使用诊断指令:
#error Oops. This is an error.
或只是警告:
#warning This is just a warning.
你通常希望将它们放在条件块中,我希望......
编辑:好的,现在你已经更新了你的问题,你根本无法在编译时这样做。您使用Assert.Fail
的建议将问题归结为执行时间。
我建议您编写单元测试以检测此问题(迭代程序集中的所有类型,并检查该属性是否每种类型最多只应用一次)。
编辑:2016年......虽然OP建议的代码分析实际上不是编译器错误,但现在Visual Studio使用Roslyn,可以挂钩编译器并真正获得编译器出错,使用Roslyn代码分析器。但是,我仍然个人更喜欢单元测试,因为代码可以由任何人构建和测试,无论他们是否安装了Roslyn分析器。仍然没有办法用“纯粹的香草”C#编译器验证这一点。答案 1 :(得分:4)
在提出这个问题一年多之后,我意识到了单元测试的另一种解决方案:代码分析。
如果不存在代码分析规则,您甚至可以roll your own。只需确保将规则设置为“错误”而不是“警告”(或确保将警告视为错误)。这是该屏幕的图像:
当然,我仍然倾向于在这种特殊情况下使用单元测试,但我绝对可以看到代码分析作为替代解决方案,特别是对于自定义命名等事情(即我的所有类应该以'Foo'结尾或者抛出错误)。
答案 2 :(得分:2)
简单答案:要求它编译语法无效的东西。
答案 3 :(得分:1)
我不相信这可以做到,因为无法告诉编译器检查自定义错误。当然,你可以像Jon说的那样使用#error,但是没有办法自己添加条件。因为#error每次都会导致错误。
唯一可以肯定的是在运行时检查然后抛出异常。
编辑:该死的,在经过大量编辑后开始质疑。