1

ライブラリにはActionというタイプがあります。VS2005、2008をサポートしており、現在はVS2010もサポートしようとしています。'Action'タイプと'System'を含む名前空間をファイルに含めて使用しようとすると、ActionタイプとSystem.Actionデリゲートの間のあいまいな参照呼び出しが表示されます。これはVS2010でのみ発生し、アクションデリゲートで何も変更されていなくてもVS2008またはVS2005でエラーをスローしません(名前空間、アセンブリはすべて3.5と4.0で同じです)。なぜこれが起こっているのか考えていますか?

アップデート:

これを再現するための簡単なアプリケーションを作成しました。

Class1.cs:

using System;
using System.Collections.Generic;
using System.Text;

namespace Namespace1
{
    public enum Action
    {
        Mouse,
        Keyboard
    }
}

Class2.cs:

using Namespace1;
using System;
using System.Collections.Generic;
using System.Text;

namespace Namespace2
{
    public class Class2
    {
        public Class2()
        {
            Action a;
        }
    }
}

上記のコードはVS2008では正常にコンパイルされますが、VS2010ではエラーがスローされます:「エラーCS0104:「アクション」は「Namespace1.Action」と「System.Action」の間のあいまいな参照です」

4.0ではなくVS2010とターゲットFramework3.5を使用すると、同じエラーが発生します。

ありがとう、ニランジャン

4

1 に答える 1

1

頭に浮かぶ疑問は、なぜ C#3 で曖昧でないのかということです (これは言語エラーになると思います)。

簡単なテストでは、次のようになります。

using System;
using ConsoleApplication1;

namespace ConsoleApplication1 {
    class Action { };
    class Program {
        static void Main(string[] args) {
            Action a = new Action();
        }
    }
}

class P2 {
    public void foo() {
        Action a;
    }
}

VS2008 (C#3) では、「'Action' は 'System.Action' と 'ConsoleApplication1.Action' の間のあいまいな参照です」というエラーが発生しP2.foo()ます。

異なるケースについてルックアップ ルールに若干の変更がある場合があります (たとえば、現在の名前空間の識別子が優先されます (class Program上記のように)。

明確にするための 2 つのオプションがあります。

  1. 完全修飾識別子を使用します (上記では、System.ActionまたはConsoleApplication1.Action.
  2. 名前空間エイリアスを使用して、あまり入力せずに識別子を完全に修飾します。

    MyAction = MyNamespace.Action を使用します。

注意。VS2010/C#4 (ベータ 2) では、上記のコードで VS2008/C#3 と同じ結果が得られます。

于 2010-01-13T12:19:20.887 に答える