2

私は本質的に 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)
            {
                …
    
4

2 に答える 2

3

VB.NETimportでは、名前空間の最初の部分に がある場合、後半だけを参照できます。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 { … }

  • (ブロック内で) 名前空間で型を完全に修飾することなく名前空間からを参照できます。AA.B

  • orのサブ名前空間の名前、名前からorの部分を省略して省略できます。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 に答える