【问题标题】:VB.NET namespace abbreviation: How do I make this work in equivalent C# code?VB.NET 命名空间缩写:如何在等效的 C# 代码中完成这项工作?
【发布时间】:2012-02-08 19:39:46
【问题描述】:

我天生就是一名 VB.NET 程序员,我很难弄清楚这一点。任何有关以下内容的帮助将不胜感激。

我需要获取下面的 C# 代码 (1) 才能工作。 VB.NET 等效的工作正常,但 C# 不能。

请注意,(2) 和 (3) 都可以工作,但这实际上是自动生成的代码,我需要 VB.NET 和 C# 版本尽可能相似。

  1. 这不会编译(Engine 的完全限定名称是ThreeD.QVB.Engine):

    using ThreeD.QVB;
    
    namespace QVBScript
    {
        public class ScriptCode
        {
            public void Main(ref Engine.QVBObjectsDictionary objects,
                             Engine.Commands commands)
            {
                …
    
  2. 但是,这确实有效:

    //using ThreeD.QVB; // I'm instead using fully-qualified names in the method
    
    namespace QVBScript
    {
        public class ScriptCode
        {
            public void Main(ref ThreeD.QVB.Engine.QVBObjectsDictionary objects,
                            ThreeD.QVB.Engine.Commands commands)
            {
                …
    
  3. 这也有效:

    using eng = ThreeD.QVB.Engine;
    
    namespace QVBScript
    {
        public class ScriptCode
        {
            public void Main(ref eng.QVBObjectsDictionary objects, 
                             eng.Commands commands)
            {
                …
    

【问题讨论】:

  • ThreeD.QVB.Engine 是包含名为 QVBObjectsDictionary 的类型的命名空间,还是具有嵌套类型的类型?一个简短但完整的例子会很有帮助。
  • 另外,你得到了什么具体的错误信息?
  • 假设您已经添加了对它的引用。尝试删除“使用 ThreeD.QVB;”从1.然后转到Engine.QVBObjectsDictionary右键单击并选择resolve,看看添加了什么using语句。

标签: c# namespaces using-directives vb.net-to-c#


【解决方案1】:

在 VB.NET 中,如果命名空间的第一部分有 import,则可以仅引用后半部分。在 C# 中,您不能这样做。对于完整的命名空间,您必须有一个 using,或者完全限定您的类型名称。不同的语言,不同的规则。

在您的最后一个示例中,您不需要使用别名。

using ThreeD.QVB.Engine;

namespace QVBScript
{
    public class ScriptCode
    {
        public void Main(ref QVBObjectsDictionary objects, Commands commands)
        {
            UI.Output Output = (UI.Output)objects["Output"];

【讨论】:

  • 是的,这就是问题和答案。不是 C# 人员并试图手动编写差异代码。谢谢。
【解决方案2】:

要记住的基本规则:

using A.B;

  • 是否允许您从命名空间 AA.B 引用 types,而无需使用它们的命名空间完全限定它们(同一文件中的任何位置) .

  • 不允许通过省略A.A.B. 来缩写AA.B. 的子命名空间 的名称部分来自他们的名字。

namespace A.B { … }

  • 确实允许您从命名空间AA.B 引用类型,而无需使用它们的命名空间(在块内)完全限定它们。

  • 是否允许您通过省略 A.A.B. 部分来缩写 AA.B 的子命名空间的名称来自他们的名字。


示例:

using System.Collections;

namespace A
{
  class Top : IDisposable, // importing System.Collections also imports System   
              IEnumerable, // inside the imported namespace
              System.Collections.Generic.IEnumerable<int>
  {…}                      // ^ "using" does not permit namespace abbreviation
}

namespace A.B
{
  class Middle : Top,      // namespace A available inside namespace A.B
                 C.IBottom // namespace blocks permit namespace abbreviation
  {…}
}

namespace A.B.C
{
  interface IBottom {…}
}

【讨论】:

    猜你喜欢
    • 2015-03-04
    • 1970-01-01
    • 2014-04-15
    • 1970-01-01
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    • 2014-06-05
    • 1970-01-01
    相关资源
    最近更新 更多