我不明白这是如何编译和完美的:|
在覆盖属性时,何时可以更改属性的类型(从Nullable<bool>
到bool
以及从int
更改为Nullable<int>
)?
public class Program
{
public static void Main(string[] args)
{
var testBase = new BaseClass();
var testDerived = new DerivedClass();
Console.WriteLine("'" + Convert.ToString(testBase.BaseInt) + "'");
Console.WriteLine("'" + Convert.ToString(testDerived.BaseInt) + "'");
Console.WriteLine("'" + Convert.ToString(testBase.BaseBoolNullable) + "'");
Console.WriteLine("'" + Convert.ToString(testDerived.BaseBoolNullable) + "'");
}
}
public class BaseClass
{
public bool? BaseBoolNullable { get; set; }
public int BaseInt { get; set; }
}
public class DerivedClass : BaseClass
{
public new bool BaseBoolNullable { get; set; }
public new int? BaseInt { get; set; }
}
输出:
'0'
''
''
'False'
答案 0 :(得分:1)
你没有overridden基本属性,只有hidden个。
如果你这样更改DerivedClass
,要访问基类的属性,你会发现它们仍然可用。
public new bool BaseBoolNullable
{
get { return base.BaseBoolNullable ?? false; }
set { base.BaseBoolNullable = value; }
}
public new int? BaseInt
{
get { return base.BaseInt; }
set { base.BaseInt = value ?? 0; }
}
如果您使用了virtual
和override
,那么您会看到,如您所料,您实际上无法覆盖具有其他类型的属性。
public class BaseClass
{
public virtual bool? BaseBoolNullable { get; set; }
public virtual int BaseInt { get; set; }
}
public class DerivedClass : BaseClass
{
public override bool BaseBoolNullable { get; set; }
public override int? BaseInt { get; set; }
}
'DerivedClass.BaseBoolNullable':type必须是'bool?'匹配重写成员'BaseClass.BaseBoolNullable'
'DerivedClass.BaseInt':type必须为'int'才能匹配被覆盖的成员'BaseClass.BaseInt'