Нет, компилятор не допускает, чтобы поля одного и того же имени имели разные типы данных, кроме тех, которые определены в интерфейсе в производных классах.
Свойства (поскольку в интерфейсе не допускаются поля) должны быть реализованы в производных классах, и они должны иметь одинаковый тип данных. Таким образом, вы не можете сделать это со свойствами без явного объявления.
Однако, если вы сделаете Value возвращаемым функцией, то это сработает, но вам нужно проверить тип возвращаемого значения, потому что возвращаемые типы должны совпадать для функции, иначе вы получите ошибку, что функция интерфейса не была реализована.
interface IControl
{
object Value();
}
class A : IControl
{
string m_value = string.Empty;
public object Value() { return m_value; }
};
class B : IControl
{
List<IControl> m_value = new List<IControl>();
public object Value() { return m_value; }
};
....
object o = new B().Value();
if (o is List<IControl>)
MessageBox.Show("List");
[Update]
Вы должны быть осторожны, если явно определяете тело свойств. Наличие одного имени для двух свойств было бы опасно, если реализация не выполнена тщательно.
Эти два свойства, если они содержат разные определения, были бы необъяснимы для конечного использования интерфейса и классов.
public IList<IControl> Value
object IControl.Value
См. Этот пример:
...
class Repeater : IControl
{
List<IControl> m_Value = new List<IControl>();
public IList<IControl> Value
{
get { return this.m_Value; }
set { this.m_Value = (IList<IControl>)value; }
}
object IControl.Value
{
get
{
return this.m_Value;
}
set
{
this.m_Value = new List<IControl>();
this.m_Value.Add(new Label());
this.m_Value.AddRange((List<IControl>)value);
}
}
}
...
Repeater b = new Repeater();
IControl i = b;
List<IControl> list = new List<IControl>();
list.Add(new Repeater());
i.Value = list;
Вы можете заметить, что контейнер списка в Repeater будет иметь разные значения при добавлении данных через IControl (из-за явного определения IContainer.Value).