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

Using CompilerMessageAttribute to produce a compiler error, but only in other assemblies

我有一个联合类型,它有一个空的 case。

type Default =
    | Default

这种类型有其用途,但并不意味着可见或可用。 不幸的是,我必须在需要可见的内联函数中使用它。这使我无法将类型或大小写设为私有。

我想出的解决方案是在其上使用 CompilerMessageAttribute 来在使用时发出错误信号。这很好,但现在我无法编译自己的程序集,因为 IT 使用它。

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

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

  • 类型需要是public,这样其他程序集就可以通过内联隐式引用它。
  • 但是如果其他程序集明确引用它,那就是一个错误。

我不知道有什么方法可以使用标准工具执行此操作。

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

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

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

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

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

是的,它非常笨拙。