Почему представление метаданных VS не отображает явные элементы, реализованные в интерфейсе - PullRequest
6 голосов
/ 01 сентября 2011

На днях я просматривал метаданные логической структуры C #.

Логический интерфейс реализует интерфейс IConvertible.Но, глядя на членов Boolean, я не смог увидеть большинство членов IConvertible.

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

Вопрос в том, почему они не видны?Я понимаю, что это может быть «конструктивное решение», но я понимаю, что это повысит ценность, если они будут видны любому, кто проверяет метаданные.

Тесты проводились в VS2010 .NET4.0

Ответы [ 4 ]

5 голосов
/ 01 сентября 2011

Причина в том, что эти методы существуют только для реализации I-интерфейса, а не для расширения открытого интерфейса класса.

Я имею в виду, что если у вас есть следующее:

public class MyClass : IConvertible
{
 // implementation
}

Возможно, вы хотите, чтобы MyClass был конвертируемым, поэтому вы можете передавать ссылки на него методам, которые ожидают IConvertible:

public void DoSomethingWithConvertible(IConvertible conv)

Но вы можете не захотеть, чтобы переменные типа MyClass представляли методы Convert. Вы просто не хотите, чтобы открытый интерфейс MyClass имел этот метод, тогда вы реализуете интерфейс явно. Вот и вся идея подхода. Это означает, что следующее не разрешено:

MyClass a = new MyClass();
a.Convert();

Тем не менее, по-прежнему допускается следующее:

MyClass a = new MyClass();
((IConvertible)a).Convert();

Вся идея этого заключается в том, что, хотя мы используем точно такой же экземпляр, метод MyClass не имеет метода. А как у IConvertible есть метод. Думайте об этом, как будто вы позволяете инстансу иметь раздвоение личности.

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

Кстати, спасибо за отличный вопрос!

2 голосов
/ 01 сентября 2011

Поскольку явная реализация интерфейса фактически скрывает реализацию.

2 голосов
/ 01 сентября 2011

Метаданные действительно показывают , явно реализованный . Вы имеете в виду intellisense, а не метаданные?

Я бы сказал, что это разработано и помог бы разработчику, скажем, Boolean, ограничить интерфейс подмножеством. Ограничение того, что предлагается использовать, также становится видимым, что считается ненормальным использованием. Например. как правило, не рекомендуется рассматривать логическое значение как конкретное числовое значение, но в некоторых случаях это удобно делать в любом случае.

IDictinary<T,K> - другой пример. Он реализует IEnumerable<KeyValuePair<T,K>>, что позволяет перебирать все пары в коллекции и ICollation<KeyValuePair<T,K>>. Таким образом, вы можете вызвать Add для словаря, заданного KeyValuePair, но обычно вы должны использовать Add(K, key, T Value)

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

0 голосов
/ 01 сентября 2011

Они явно реализованы .Вы можете найти все реализованные кабриолеты здесь: http://msdn.microsoft.com/en-us/library/system.boolean.aspx

...