使用CompilerMessageAttribute生成编译器错误,但仅在其他程序集中生成

时间:2015-04-07 14:30:27

标签: f#

我的联合类型有一个空案例。

type Default =
    | Default

这种类型有一个目的,但它并不意味着可见或可用。 不幸的是,我必须在需要可见的内联函数中使用它。这使我无法将类型或案例设为私有。

我提出的解决方案是使用CompilerMessageAttribute来表示错误,无论何时使用它。这没关系,但现在我无法编译自己的程序集,因为IT使用它。

是否有办法仅在引用我的程序集的程序集使用它时发出错误信号?

1 个答案:

答案 0 :(得分:8)

让我重申一下要求,以确保我理解它们:

  • 类型必须是 public ,以便其他程序集可以通过内联隐式引用它
  • 但如果其他程序集明确引用 ,则表示错误。

我不知道如何使用标准工具来做到这一点。

我可以看到两种可能的解决方案。

如果只有一个调用程序集需要使用内联函数,那么使用InternalsVisibleToAttribute将内部类型设置为内部然后将调用程序集作为友元程序集。

我能想到的唯一另一种选择是默默无闻的安全。在一些笨拙命名的模块中隐藏类型并要求模块限定。这将阻止意外使用该类型,如果没有别的。 您甚至可以添加构建步骤来检查没有源代码引用模块名称。

[<RequireQualifiedAccessAttribute>]
module ``Dont Use This`` = 
    type Default =
        | Default

let x = ``Dont Use This``.Default

是的,这非常愚蠢。