Неоднозначная ошибка ссылки в VS2010 - PullRequest
1 голос
/ 13 января 2010

В нашей библиотеке есть тип Action. Мы поддерживаем VS2005, 2008 и теперь пытаемся поддержать VS2010. Когда я включаю пространство имен, содержащее наш тип «Action», а также «System», в файл и пытаюсь его использовать, оно выдает неоднозначный ссылочный вызов между нашим типом Action и делегатом System.Action. Это происходит только в VS2010 и не выдает ошибку в VS2008 или VS2005, даже если с делегатом Action ничего не изменилось (пространство имен, сборка, все то же самое между 3.5 и 4.0). Есть идеи, почему это может происходить?

UPDATE:

Я создал простое приложение, чтобы воспроизвести это:

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 »»

Я получаю ту же ошибку, когда использую VS2010 и целевой Framework 3.5 вместо 4.0.

Спасибо, Niranjan

1 Ответ

1 голос
/ 13 января 2010

Возникает вопрос, почему это не является двусмысленным в 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) появляется ошибка: «Действие» является неоднозначной ссылкой между «System.Action» и «ConsoleApplication1.Action» »в P2.foo().

Могут быть небольшие изменения в правилах поиска относительно того, как разные случаи (например, идентификатор в текущем пространстве имен имеет приоритет (как в class Program выше).

Существует два варианта устранения неоднозначности:

  1. Используйте полностью квалифицированные идентификаторы (как указано выше, System.Action или ConsoleApplication1.Action.
  2. Используйте псевдоним пространства имен, чтобы полностью квалифицировать идентификатор без необходимости набирать:

    с использованием MyAction = MyNamespace.Action;

NB. VS2010 / C # 4 (бета 2) дает тот же результат с кодом выше, что и VS2008 / C # 3.

...