gpt4 book ai didi

c# - InternalsVisibleTo 属性问题

转载 作者:行者123 更新时间:2023-11-30 22:11:19 26 4
gpt4 key购买 nike

我有两个程序集,比如 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 是同一个程序集(?)

这是一个大问题,因为这意味着我需要手动将每个覆盖更改为 protected 内部覆盖,并且有很多覆盖。此外,我可能想稍后删除该属性,然后我需要再次更改所有内容。

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

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

最佳答案

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

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

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

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

有道理吗?

关于c# - InternalsVisibleTo 属性问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20305689/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com