Type のエイリアスと外部アセンブリの競合の解決

タイプ エイリアス

同じアセンブリまたは別のアセンブリに同じ名前の 2 つのクラスが存在する可能性がありますが、設計上の制限によりクラスの名前を変更することはできません。

下の図 1 に示すように、AssemblyA にクラスがあるとします。

また、次のコード スニペットに示すように、プロジェクトで AssemblyA を参照し、MyClass のインスタンスを使用しています。

using AssemblyA;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TypeAliases
{
    class Program
    {
        static void Main(string[] args)
        {
            var instance = new MyClass();
        }
    }
}

ここで、プロジェクト内で MyClass という名前の新しいクラスを同じプロジェクト内に作成する必要が生じますが、同じアセンブリ内または別のアセンブリ内にある可能性があります。そして、次の図に示すように、いくつかの命名制限またはその他の問題のために、新しいクラスに MyClass という名前を付ける必要があります。

以前に作成したクラスに沿って新しいクラスにアクセスする必要がある場合は、以下のコード スニペットに示すように、アセンブリと共にクラスの完全修飾名を使用する必要があります。

static void Main(string[] args)
        {
            var instance = new MyClass();
            var instance2 = new AssemblyA.SubAssembly.MyClass();
        }

多くの場所で同じクラスを使用する必要がある場合、上記のコードは少しぎこちなく、保守が困難になる可能性があります。
代わりに、次のように型エイリアスを作成できます。次のコード スニペットを使用して、完全な名前空間名の代わりに使用してください。

using AssemblyA;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MyClass2 = AssemblyA.SubAssembly.MyClass;

namespace TypeAliases
{
    class Program
    {
        static void Main(string[] args)
        {
            var instance = new MyClass();
            var instance2 = new MyClass2();
        }
    }
}

上記のコードを実行すると、図に示すように、AssemblyA のサブフォルダーにある MyClass から instance2 が作成されていることがわかります。

クラスのアセンブリ競合の解決

プロジェクトで参照したい同じ名前空間を持つ 2 つのアセンブリに同じクラス名が存在する場合があります。その場合、これらのアセンブリの両方が私たちによって作成された場合、クラスの名前と可能であればアセンブリの名前を簡単に変更できます。しかし、これらのアセンブリの両方がサード パーティによって開発されていると仮定すると、その場合、クラスの名前を変更することはほとんど不可能です。その場合、コンパイラは、クラスのインスタンスを作成するためにどの名前空間を参照するかを判断できません。以下のコード スニペット。

namespace MyNamespace
{
    public class MyClass
    {
        public override string ToString()
        {
            return "I am in ClassLibrary1";
        }
    }
}
namespace MyNamespace
{
    public class MyClass
    {
        public override string ToString()
        {
            return "I am in classLibrary2";
        }
    }
}

これらのアセンブリの両方に参照を追加し、MyClass のインスタンスを作成しようとすると、「MyClass は ClassLibrary1 と ClassLibrary2 の両方に存在します」というコンパイル時エラーが発生します。 「両方のアセンブリに完全修飾型が存在します」
このエラーを解決するには、以下に示すように、これらのアセンブリの両方にエイリアスを指定する必要があります。
アセンブリを右クリックし、以下に示すようにプロパティを開きます形。両方のアセンブリのエイリアスを Lib1 と Lib2 に変更しました。

名前空間のエイリアスを変更した後、以下に示すように、コードで変更されたエイリアスを参照する必要があります。

extern alias Lib2;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;



namespace TypeAliases
{
    class Program
    {
        static void Main(string[] args)
        {
            var inst1 = new Lib1.MyNamespace.MyClass();
            var inst2 = new Lib2.MyNamespace.MyClass();
        }
    }
}

上記のコードをデバッグすると、作成されたこれらのインスタンスの両方がそれぞれのクラスのものであることがわかります。

このブログでは、型エイリアスとアセンブリ エイリアスを追加する方法をデモしました。