102

例如,我收到这个编译器警告,

从未使用过事件“Company.SomeControl.SearchClick”。

但我知道它已被使用,因为将其注释掉会使我像 20 个试图使用此事件的 XAML 页面的新警告一样!

是什么赋予了?有没有办法摆脱这个警告?

4

7 回答 7

167

这似乎是警告 67,因此可以通过以下方式抑制:

#pragma warning disable 67

不要忘记尽快恢复它(在事件声明之后):

#pragma warning restore 67

但是,我会再次检查并确保您在某处提出该事件,而不仅仅是订阅它。当您注释掉事件时编译器会吐出 20 个警告而不是 20 个错误这一事实也很可疑......

还有一篇关于这个警告的有趣文章,特别是它如何应用于接口;关于如何处理“未使用”事件有一个很好的建议。重要的部分是:

正确的答案是明确说明您对事件的期望,在这种情况下,什么都不是:

public event EventHandler Unimportant
{
    add { }
    remove { }
}

这将完全抑制警告,以及正常事件的额外编译器生成的实现。作为另一个额外的好处,它促使人们思考这种无所事事的实现是否真的是最好的实现。例如,如果事件不那么重要,因为它不受支持,这样依赖该功能的客户端可能会在没有它的情况下失败,最好明确指出缺乏支持并通过抛出一个快速失败例外:

public event EventHandler Unsupported
{
    add { throw new NotSupportedException(); }
    remove { }
}

当然,一个可以在没有某些部分功能的情况下有效实现的接口有时表明该接口不是最佳内聚的,应该拆分为单独的接口。

于 2009-07-07T16:23:32.517 回答
85

如果您被迫从接口实现事件,那么您的实现不需要您可以执行以下操作以避免警告。

public event EventHandler CanExecuteChanged { add{} remove{} }
于 2010-09-09T08:50:57.673 回答
19

第二个最好的方法是恕我直言,如果有人尝试订阅它,则通过抛出异常来明确声明该事件不受支持。

public event RoutedEventHandler SearchClick
{
    add { throw new NotSupportedException(); }
    remove { throw new NotSupportedException(); }
}

作为对此的一种变体,您也可以将addandremove方法留空以静默忽略事件的订阅。

最好的解决方案是重构代码,如果可能的话,也许将事件声明拉给实现者。

作为最后的手段,您也可以像这样禁用警告

#pragma warning disable 67
public event RoutedEventHandler SearchClick;
#pragma warning restore 67
于 2013-12-03T13:07:29.090 回答
5

您还可以执行以下操作:

public event EventHandler MyEvent = delegate {}
于 2018-08-14T21:16:52.693 回答
1

编译器显然不知道它正在 XAML 代码中使用。尝试抑制事件定义中的警告。

另外,请确保您实际上是在某处提出事件。

于 2009-07-07T16:22:17.340 回答
1

您可以禁止个别警告。

\Program.cs(13,20): warning CS0219: The variable 'foo' is assigned but its value is never used

在这种情况下,CS0219 是有关已分配但未使用的变量的警告。您可以使用 /nowarn:0219 标志,或者在项目的属性窗格中添加错误号(在“构建”下,请记住删除前导 CS)。请记住,禁止此类的所有警告。

于 2009-07-07T16:23:25.527 回答
1

或者您可以添加<NoWarn>67</NoWarn>到您的项目中

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
  ...
  <NoWarn>67</NoWarn>
</PropertyGroup>
于 2013-11-05T04:52:55.150 回答