【问题标题】:C#: why is fully-qualified name needed despite using?C#:为什么尽管使用了完全限定的名称?
【发布时间】:2014-08-01 18:34:01
【问题描述】:

我正在制作一个跨平台的 C# 绘图库供我自己使用,它以 System.Drawing 为模型,并尽可能多地使用标准 System.Drawing 类型(例如 PointF、RectangleF、Color 和 Pen)。

很遗憾,iOS 上没有提供 Pen 类。因此,在为 iOS 编译时,我在 System.Drawing 中添加了这个,并设计为尽可能与标准 System.Drawing.Pen 类兼容。到目前为止一切顺利。

今天我添加了对线帽和连接样式的支持。在标准框架中(但不是在 iOS 上),这些是在 System.Drawing.Drawing2D 命名空间中定义的。所以,我再次添加了它们,代码只在 iOS 上编译:

namespace System {
    namespace Drawing {
        namespace Drawing2D {
            public enum LineCap {
                Flat,
                Round,
                Square   // (etc.)
            }
        }
    public class Pen {
        public Color Color;
        public float Width;
        public Drawing2D.LineCap StartCap;
        public Drawing2D.LineCap EndCap;
        // (etc.)
        }
    }
}

现在我们来看看奇怪的地方。在我试图使用所有这些的主程序中,我有“使用 System.Drawing;”在文件的顶部。我发现,即使在 iOS 上,我现在也可以直接使用 Pen:

Pen p = new Pen(Color.Yellow, 6);

但是,如果我尝试直接使用 Drawing2D.LineCap,则会收到 CS0103 错误,“当前上下文中不存在名称 'Drawing2D'。”

p.StartCap = Drawing2D.LineCap.Round;   // <-- ERROR

为了使它起作用,我必须完全限定名称,如下所示:

p.StartCap = System.Drawing.Drawing2D.LineCap.Round;   // <-- OK (but sad)

所以,我想了解这是为什么。我知道当某个东西有两个版本时,可能需要一个完全限定的名称,因此编译器无法解决您的意思。但在这种情况下我看不到碰撞。据我所知,MonoTouch 根本没有 System.Drawing2D 命名空间。我给了它一个,那有什么问题?

【问题讨论】:

  • 我做了:“使用 System.Drawing;”。

标签: c# ios namespaces xamarin using


【解决方案1】:

不包括嵌套命名空间。 Documentation:

“using 指令不允许您访问嵌套在您指定的命名空间中的任何命名空间。”

所以你应该说: using System.Drawing.Drawing2D 如果你想使用那个类。

【讨论】:

  • 是的,这就是问题所在!非常感谢您指出这一点。
猜你喜欢
  • 1970-01-01
  • 2023-03-09
  • 2019-10-09
  • 2013-06-21
  • 2012-02-17
  • 1970-01-01
  • 2019-07-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多