2016-08-18 3 views
-3

Итак, я пытаюсь преобразовать объект в DTO, используя точно такого же типа. Оба типа (классы) являются точными, за исключением того, что они находятся в разных пространствах имен.Тот же тип, другое пространство имен.

Должен ли я использовать их, когда я ссылаюсь либо на другое пространство имен?

Или VS должен автоматически знать и распознавать, что они такие же, хотя в разных файлах?

Благодаря

+0

Различное пространство имен = другой тип. VS не может (и, конечно же, не должен) автоматически определять ваши намерения в этом случае. Вам нужно будет предоставить оператор преобразования/литья. Взгляните на [Операторы преобразования C#] (https://msdn.microsoft.com/en-us/library/85w54y0a.aspx) – CoolBots

+0

Просто попробуйте, и вы узнаете ответ ... –

+1

Проблема с вопросом заключается в том, что вы принимаете то, о чем говорите. Два типа, которые отличаются в своем пространстве имен, являются разными типами *, потому что * они находятся в разных пространствах имен. Понятие о том, что два типа «одинаковы, но в разных пространствах имен», противоречиво. –

ответ

1
namespace SomeInternetShoppingSite 
{ 
    public class Client 
    { 
      public int Id { get; } 
      public sprint FirstName { get; } 
      ... 
    } 
} 

namespace SomeOnlineBankingSite 
{ 
    public class Client 
    { 
      public int Id { get; } 
      public sprint FirstName { get; } 
      ... 
    } 
} 

Вы действительно думаете, следующее должно быть законным?

var bankClient = new SomeOnlineBankingSite.Client(...); 
var shoppingClient = (SomeInternetShoppingSite.Client)bankClient; 

Хотя оба класса идентичны, они представляют собой две совершенно разные абстракции двух очень разных понятий. Даже если компилятор может достаточно легко понять, что определения типов одинаковы, он не имеет права допускать явное или неявное преобразование между ними; только авторы классов имеют право разрешить это преобразование, если они того пожелают, внедряя оператор литья, статический заводский метод или то, что у вас есть.

1

В основном, что вы описываете, является duck typing. Ближайшим эквивалентом C# является ключевое слово «dynamic», но я не думаю, что это именно то, о чем вы просите.

Как уже отмечалось, C# делает не, в общем, следовать модели типизации вы описали, и вы, вероятно, не хотите его к. Как показывает пример InBetween, существует большая разница между «тем же именем», «тем же интерфейсом» и «тем же , что означает».

Чтобы ответить на вопрос более конкретно, во-первых, я серьезно сомневаюсь в мудрости наличия двух одинаковых классов в отдельных пространствах имен - это кажется довольно явным нарушением принципа Don't Repeat Yourself. С учетом сказанного, если определить неявное преобразование между ними, которое должно позволить вам использовать их более или менее взаимозаменяемо (хотя недостатком этого является то, что он может запутать какой из двух объектов, о которых вы говорите, я склонен сказать что это плохая практика, основанная на этом факте).

Смежные вопросы