2

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

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

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

  1. 这不会编译(的完全限定名称Engineis 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)
            {
                …
    
4

2 回答 2

3

在 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"];
于 2012-02-08T19:48:59.327 回答
1

要记住的基本规则:

using A.B;

  • 确实允许您从命名空间引用类型A,而A.B无需使用它们的命名空间(在同一文件中的任何地方)完全限定它们。

  • 不允许您缩写或省略其名称中的或部分的子名称空间的名称。AA.B.A.A.B.

namespace A.B { … }

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

  • 确实允许您缩写或省略其名称中的或部分的子名称空间的名称。AA.BA.A.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 {…}
}
于 2012-02-08T20:09:46.800 回答