使用 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
是的,它非常笨拙。
我有一个联合类型,它有一个空的 case。
type Default =
| Default
这种类型有其用途,但并不意味着可见或可用。 不幸的是,我必须在需要可见的内联函数中使用它。这使我无法将类型或大小写设为私有。
我想出的解决方案是在其上使用 CompilerMessageAttribute
来在使用时发出错误信号。这很好,但现在我无法编译自己的程序集,因为 IT 使用它。
有没有办法仅在引用我的程序集的程序集使用错误时发出错误信号?
让我重申一下这些要求,以确保我理解它们:
- 类型需要是public,这样其他程序集就可以通过内联隐式引用它。
- 但是如果其他程序集明确引用它,那就是一个错误。
我不知道有什么方法可以使用标准工具执行此操作。
我可以看到两种可能的解决方案。
如果只有一个调用程序集需要使用内联函数,将类型设置为内部然后让调用程序集成为友元程序集怎么样,使用InternalsVisibleToAttribute
.
我能想到的唯一其他选择是默默无闻的安全性。将类型隐藏在一些笨拙命名的模块中并要求模块限定。如果没有别的,这将停止对该类型的意外使用。 您甚至可以添加构建步骤来检查没有源代码引用模块名称。
[<RequireQualifiedAccessAttribute>]
module ``Dont Use This`` =
type Default =
| Default
let x = ``Dont Use This``.Default
是的,它非常笨拙。