Вы не можете переопределить тип свойства.Посмотрите на следующий код:
StrBase s = new StrBase();
Base b = s;
Это полностью допустимый код.Но что происходит, когда вы пытаетесь это сделать?
b.prop = 5;
Целое число может быть преобразовано в object
, потому что все происходит от object
.Но поскольку b
на самом деле является экземпляром StrBase
, ему придется каким-то образом преобразовать целое число в строку, чего не может быть.Вот почему вам не разрешено переопределять тип.
Тот же принцип применим к обобщенным типам:
List<BaseG<object>> l = new List<BaseG<object>>();
BaseG<string> s = new BaseG<string>();
// The compiler will not allow this.
l.add(s);
// Here's the same problem, convert integer to string?
BaseG<object> o = l[0];
o.prop = 5;
Это потому, что универсальные типы в C # 2.0 являются инвариантными.C # 4.0 допускает преобразования этого типа, называемые ковариацией и контравариантностью.
Решения
Опция - привести object
обратно к строке, когда вам это нужно.Вы можете добавить проверку типа в подклассе:
public class StrBase : Base
{
private string propValue;
public override object prop {
get
{
return this.propValue;
}
set
{
if (value is string)
{
this.propValue = (string)value;
}
}
}
}
Вы также можете предоставить свойство безопасного типа в подклассе:
public class StrBase : Base
{
public string strProp {
get
{
return (string)this.prop;
}
set
{
this.prop = value;
}
}
}