【问题标题】:Issue with InternalsVisibleTo attributeInternalsVisibleTo 属性问题
【发布时间】:2013-12-16 19:50:22
【问题描述】:

我有两个程序集,例如 MainSub,其中 Sub 依赖于 MainMain 定义了一些具有protected internal virtual 成员的类,我想在Sub 中覆盖这些类。我将这些成员覆盖为protected override

Main 中有一个不相关的类,称为 Main.Shared,我想在 Sub 中使用它,但我没有不希望任何其他程序集看到它。情况如下:

//In assembly Main:
public class Shared
{
}
public class Parent
{
    protected internal virtual void DoStuff()
    {

    }
}
//In assembly Sub:
public class Child : Parent
{
    protected override void DoStuff()
    {
        base.DoStuff();
    }
} 

所以我照常使用InternalsVisibleTo 属性。但是,在我用这个属性装饰 Main 之后,代码拒绝编译。错误消息说我现在必须将 DoStuff 覆盖为 protected internal override,大概是因为它现在认为 MainSub 是同一个程序集 (?)

这是一个大问题,因为这意味着我需要手动将每一个覆盖更改为受保护的内部,而且其中有很多。此外,我可能想稍后删除该属性,然后我需要重新更改所有内容。

有什么办法可以避免这样做吗? (除了代码库的完全重新设计......)

我也很好奇为什么会发生这种情况。这种行为只是某种盲点,还是应该像这样工作?

【问题讨论】:

  • 有趣的捕获 - 将自己检查。
  • 嗯 - 它对我来说很好用。你用的是什么编译器版本?
  • @JonSkeet 我看到了同样的问题,我正在使用 VS 2012,即 C# 编译器版本 4.0.30319.17929。
  • @mikez:也许它已在 VS 2013 附带的 4.0.30319.33440 中修复?
  • 嗯。不过也适用于 v3.5。将发布我的代码作为答案...

标签: c# inheritance assemblies internalsvisibleto


【解决方案1】:

好的,我想我现在明白了。虽然 C# 规范没有提到这一点,但它实际上根本没有提到 InternalsVisibleTo。我认为理解它的方法是,您不能通过覆盖来更改成员可接受的呼叫站点集。

对于所有其他可访问性修饰符,这仅意味着您必须坚持使用相同的修饰符 - 但 protected internal 略有不同。如果没有InternalsVisibleTo,则可以在原始程序集和子类中访问(遵守protected 的正常规则,准确但简洁地编写有点困难)。当您在不同的程序集中覆盖它时,您通常必须将其设为 protected,以便它仍然仅可用于子类和 原始 程序集 - 而不是您的“新”程序集。

但是现在,当您将 InternalsVisibleTo 带入图片时,将其设置为 protected降低可访问性 - 因为第二个程序集中的所有代码已经可以访问该成员。因此,您需要将其保留为 protected internal 以保留它。 (第二个程序集的内部结构不必对原始程序集可见,因为原始程序集无论如何都不能引用第二个程序集,因为那样您就会有一个循环引用。)

但它仍然会下降 - 因为这可能仍然增加可访问性 - 如果您有组件 A 的内部对组件 B 可见,而组件 B 的内部对组件 C 可见,那么 @程序集 A 中的 987654329@ 方法应该对程序集 A 和 B 可见;但是当您在程序集 C 中覆盖它时,您可以使其对程序集 B 和 C 可见,或者仅对子类可见。在这一点上,您确实想让它对“程序集 A 及其信任的程序集”可见 - 但没有办法表达。

有意义吗?

【讨论】:

  • 是的,我明白了。我想,以这种方式考虑它,它真的不可能以任何其他方式起作用。在这种情况下,增加可访问性似乎比减少它要好,因为后者会导致结果不一致。我遇到的不便更多是由于 C# 要求明确指定可访问性修饰符,而不是属性的操作,这实际上是有道理的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-31
  • 1970-01-01
  • 2010-12-06
  • 2010-10-18
  • 1970-01-01
相关资源
最近更新 更多