Двусмысленное имя класса - PullRequest
4 голосов
/ 29 апреля 2010

Если есть новый проект (ProjNew), в который я хочу поместить несколько классов, которые находятся в другом проекте (ProjOld).

Проблема в том, что я хочу сохранить старые классы, помеченные как устаревшие, чтобы избежать запуска всех моих проектов и проверить, используют ли они их.

Но в этом случае это может привести к неоднозначной ошибке имени класса, поскольку я не вызывал явно по пространству имен.

Есть ли способ сказать в устаревшем, какую сборку использовать в случае неоднозначности?

Ответы [ 5 ]

4 голосов
/ 29 апреля 2010

Не совсем понятно, о чем вы спрашиваете, но я все равно попробую.

Предположим, у вас есть две DLL, old.dll и new.dll, каждая из которых имеет пространство имен N с типом C. Вы можете сделать это:

csc /r:NEW=new.dll /r:OLD=old.dll foo.cs

а затем в foo.cs вы можете сказать

extern alias NEW;
extern alias OLD;
class D : NEW::N.C { }
class E : OLD::N.C { }

и D наследует от N.C в new.dll, E наследует от N.C в old.dll.

Решает ли это вашу проблему?

2 голосов
/ 29 апреля 2010

Я не уверен, что полностью понимаю ваш вопрос, но это может помочь. Вы можете использовать директиву Using, чтобы уточнить, какой класс использовать. Пример: используя ClassA = OldAssembly.ClassA;

Все ссылки на ClassA будут ссылаться на OldAssembly.

1 голос
/ 29 апреля 2010

Вы можете создать классы как частичные классы и отметить методы, которые должны быть устаревшими.

Это позволит вам разделить ваши классы на несколько файлов и при этом использовать одно и то же имя класса.

0 голосов
/ 29 апреля 2010

OK. Кажется, что если я добавляю тот же класс в другое пространство имен, возникает ошибка ambiguos, это просто происходит во время компиляции. Я боялся, что это произойдет во время выполнения, но я проверил это, и не было никаких проблем.

Спасибо

0 голосов
/ 29 апреля 2010

Отметьте свои классы с помощью System.ObsoleteAttribute

http://msdn.microsoft.com/en-us/library/system.obsoleteattribute.aspx

using System;

class Program
{
    static void Main()
    {
        MethodA();
    }

    [Obsolete("Use MethodB instead")]
    static void MethodA()
    {
    }

    static void MethodB()
    {
    }
}
...