在编译时检查参数范围

时间:2017-02-08 07:59:02

标签: c# range

我想提供一个int参数的函数,该参数必须在预定范围内(例如10-20)。我希望它在编译时中生效,理想情况是在智能感知时间 - 这意味着每当用户键入MyFunction(30)时,30都会突出显示为编译错误。

我意识到编译器无法知道编译时的值是什么 - 例如MyFunction(new Random().Next(100))。因此,我还应该在运行时和throw ArgumentOutOfRangeException检查参数。但是,我确实希望编译器/ IDE突出显示已知的超出范围的编译时值。

我试过了:

void MyFunction([System.ComponentModel.DataAnnotations.Range(10,20)] int param)

但这并没有在任何地方强制执行。

回应评论:

  • Enum:我希望这是一个标量值,但有限。例如,param可以是fileSize,我想将其限制为500,000(= ~500KB) - 所以当用户调用MyFunc(fileSize:1000000)时,他会收到编译错误。显然,枚举不适合这种模式。
  • 仅限常数:在大多数情况下,我的用户将使用常量 - 这就是为什么这对我有价值。
  • Resharper不是一个选项,因为我的用户不会在他们的机器上拥有它。
  • Roslyn Analyzer看起来很有趣,但我需要找到一种方法将它分发给我的用户,这确实有点过分。
  • 我不确定单元测试会有什么帮助 - 如果我的用户调用超出范围的值,那就是他们的错误,我的单元测试也无法捕获它。我当然会在运行时发现这个问题。

0 个答案:

没有答案