Сокращение пространства имен VB.NET: Как мне заставить это работать в эквивалентном коде C #? - PullRequest
2 голосов
/ 08 февраля 2012

Я по натуре программист на 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)
            {
                …
    

Ответы [ 2 ]

3 голосов
/ 08 февраля 2012

В 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"];
1 голос
/ 09 февраля 2012

Основные правила, которые нужно запомнить:

using A.B;

  • действительно позволяет вам ссылаться на типов из пространств имен A и A.B без полной квалификации их пространства имен (везде в одном файле).

  • не позволяет сокращать имена пространств имен до из A или A.B., пропуская часть A. или A.B. из их имена.

namespace A.B { … }

  • действительно позволяет вам ссылаться на типов из пространств имен A и A.B без полной квалификации их пространства имен (внутри блока).

  • действительно позволяет вам сокращать имена под- пространств имен из A или A.B, пропуская часть A. или A.B. из их имена.


* +1057 * Пример:
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 {…}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...