Проверьте дату стандарта ISO; вроде как это:
yyyy.MM.ddThh:mm
Это становится 2008.11.20T22:18
.
Со следующим кодом:
interface I1 { }
interface I2 : I1 { }
class Foo: I2 { }
Если вы посмотрите на Foo через отражение, вы найдете
class Foo: I2, I1 { }
, который также подходит для компиляции и дает тот же результат.
Так что разница спорна, и при документировании Foo вы могли бы также написать его с обоими интерфейсами.
Также см. Вопрос SO: Почему классы коллекций в C # (например, ArrayList) наследуются от нескольких интерфейсов, если один из этих интерфейсов наследуется от остальных?
Эффективной разницы нет. Я считаю, что дополнительные объявления приведены для ясности.
При проверке в Reflector классы, которые в коде реализуют IList
, имеют тот же список объявлений интерфейса, что и классы, которые в коде объявляют, реализуют все Ilist
, ICollection
и IEnumerable
.
Я не уверен, что ArrayList
имеет отдельные реализации интерфейсов. Рассмотрим следующий код:
public interface IBase
{
int SomeInt { get; set; }
}
public interface ISub : IBase
{
int SomeOther { get; set; }
}
public class MyClass : ISub
{
public int SomeOther { get; set; }
public int SomeInt { get; set; }
}
Тип MyClass
напрямую реализует только интерфейс ISub
. Однако, если вы скомпилируете код в сборку, а затем добавите эту сборку в качестве ссылки в другой проект, откройте обозреватель объектов и изучите базовые типы для MyClass
, он будет иметь что-то вроде этого:
Base Types
|- ISub
| |- IBase
|- IBase
|- Object