为什么我可以访问命名空间之外的内部方法?

Why do i have access to internal methods outside of the namespace?

我想了解访问修饰符,但我对如何使用有点困惑 internal

我的命名空间中有 class,如下所示:

namespace Grids
{
    public abstract class Grid
    {
        internal abstract Vector2Int ToGrid(float worldX, float worldY);
        internal Vector2Int ToGrid(Vector3 worldPoint) => ToGrid(worldPoint.x, worldPoint.z);
        internal Vector2Int ToGrid(Vector2 worldPoint) => ToGrid(worldPoint.x, worldPoint.y);
    }
}

然后在继承的 class 中实现,如下所示:

namespace Grids
{
    public class RectGrid : Grid
    {
        public int Width;
        public int Height;
        public Grid(int w, int h)
        {
             Width = w;
             Height = h;
        }
        internal override Vector2Int ToGrid(float worldX, float worldY)
        {
            int col = Mathf.FloorToInt(worldX / Width);
            int row = Mathf.FloorToInt(worldY / Height);
            return new Vector2Int(col, row);
        }
    }
}

所以我现在制作一个 class 来使用这个不属于命名空间的网格:

using Grids;
using UnityEngine;

public class MapGenerator : MonoBehaviour
{
    private RectGrid _rectGrid;
    
    void Awake() {
        _rectGrid = new RectGrid(1,1);   
        _rectGrid.ToGrid(Vector3.zero); // why do i have access to this function         
    }
}

但出于某种原因我可以访问假定为内部的功能:

这是为什么?我不想公开此功能我希望它只能由我的 Map class 访问,它共享相同的 Grids 命名空间并将控制我公开的内容。然而我的 MapGenerator class 即使不属于命名空间也可以访问?

我是不是误解了这里的内部工作原理?

根据文档internal (C# Reference)

Internal types or members are accessible only within files in the same assembly

根据您的评论

[It's] difficult to design a way to hide these functions but still give access to a specific class.

标准的访问修饰符相当有限,您需要将调用代码放在同一个程序集中才能使用internal.此外,除非您在运行时执行此操作,否则无法授予调用 类 的访问列表。

但是,您可以使用 Explicit Interface Implementation。这不会完全限制访问,但它会限制访问,因此您需要明确要求它,并在任何其他时间隐藏它。

public interface IGrid
{
    Vector2Int ToGrid(...);
}

public abstract class Grid : IGrid
{
   Vector2Int IGrid.ToGrid(...) {}
}

用法

var rectGrid = new RectGrid();
((IGrid)rectGrid).ToGrid(); // you need to explicitly cast to the interface