Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果多个成员具有相同的属性,如何引发编译器错误_C#_.net_.net 4.0_Attributes_Compiler Errors - Fatal编程技术网

C# 如果多个成员具有相同的属性,如何引发编译器错误

C# 如果多个成员具有相同的属性,如何引发编译器错误,c#,.net,.net-4.0,attributes,compiler-errors,C#,.net,.net 4.0,Attributes,Compiler Errors,简单的问题是,如何强制C#编译器抛出编译错误 更新:也许最好使用Assert.Fail() 我有一个自定义属性,它应该只应用于类的一个成员。在我的另一个类的静态方法中,它查找一个成员,如果有多个成员应用了该属性,我希望它失败(而不是抛出异常) public class Foo { [MyCustomAttribute] public String FooString { get; set; } [MyCustomAttribute] public String

简单的问题是,如何强制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()?
    }
}
公共类Foo
{
[MyCustomAttribute]
公共字符串FooString{get;set;}
[MyCustomAttribute]
公共字符串OtherFooString{get;set;}
}
公共类酒吧
其中T:class,new()
{
静态条()
{
//如果Foo类型的多个成员具有MyCustomAttribute
//应用于它的编译错误或Assert.Fail()?
}
}

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

您可以使用诊断指令:

#error Oops. This is an error.
或者只是一个警告:

#warning This is just a warning.
你通常会想把这些放在条件块中,我想

编辑:好的,现在你已经更新了你的问题,你不能在编译时这样做。您建议使用
Assert.Fail
将问题推到执行时间

我建议您编写单元测试来检测这一点(迭代程序集中的所有类型,并检查每个类型最多应用一次属性)


编辑:2016年。。。虽然OP建议的代码分析实际上不是编译器错误,但既然Visual Studio使用了Roslyn,使用Roslyn代码分析器连接到编译器并真正从编译器中获取错误是可行的。然而,我个人还是更喜欢为此进行单元测试,因为这样任何人都可以构建和测试代码,不管他们是否安装了Roslyn analyzer。仍然没有办法用“纯普通”的C#编译器来验证这一点。

我认为这是不可能的,因为不可能让编译器检查自定义错误。当然,你可以像Jon说的那样使用#error,但是没有办法添加条件本身。因为#错误每次都会导致错误

唯一可以确定的是在运行时检查,然后抛出异常


编辑:该死,在大量编辑之后才开始提问。

在提出这个问题一年之后,我意识到了单元测试的另一种解决方案:代码分析

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


当然,在这种特殊情况下,我仍然倾向于使用单元测试,但我可以肯定地将代码分析视为一种替代解决方案,特别是对于自定义命名(即,我的所有类都应该以“Foo”结尾或抛出一个错误)。

你到底为什么要这样做?Assert.Fail()不会抛出编译器错误,它向我们提出了一个断言runtime@Matt字体我知道,我在想什么会更好。。。。编译错误或断言错误。啊。那么,根据您的新信息,我认为在运行时抛出异常是一个更好的选择。@m-y正如@Matt所指出的,这取决于;对于静态代码检查,编译错误通常是首选,因为您在编译时知道的事情最好现在处理,而不是在未知的情况下处理;但是您试图处理的控件不是纯粹的静态检查-您可以在运行时修饰
Foo
的另一个成员,然后编译错误就不会出现了。是的。我有一个严格的条件。不过,我想知道。。。这样做更好还是使用Assert.Fail()更好?我要出错的部分在静态构造函数中。我在上面也留下了一条注释,您不能使用Assert.Fail(),因为它不会引发编译器错误,而是在运行时引发Assert。@myermian:Assert.Fail和
\error
都不是您想要的。改用单元测试。嗯。。。现在我想了想,我不认为我可以得到我需要的逻辑,在我的场景中抛出一个编译错误。根据我的例子,有可能做我想做的吗?关于指令的更多信息:,呃,很抱歉。在我发布了这个问题之后,我意识到也许我应该提供更多的信息,作为一种“……我应该以那种特殊的方式来做吗?”的补充。这也是我做的一件好事,因为Jon是对的,在这种情况下,单元测试有助于使事情保持一致。自定义代码分析规则是否可能包含在项目或解决方案中,以便当其他开发人员在他们的工作站上处理同一项目/解决方案时,他们也不必手动设置规则?@crush,你有没有想过是否可以将规则嵌入到项目中?@JonathanWilson:我可以告诉你,现在我们有了Roslyn,可以将.NET分析器作为NuGet包包含在项目中。