谁能解释我这个问题?
使其正常工作的唯一方法是在 CorrectName 中使用 virtual,然后在 Derived 中覆盖,而不是 new 关键字,但是,为什么会发生这种情况?
为什么如果我通过泛型转换它会给我 Base 值,如果我直接转换它会给我 Derived 值?((输出如下))
谢谢大家,正如我所说的那样,我已经有了“解决方案”,但我想了解
class Base
{
public string Name { get; set; }
public string CorrectName { get { return Name; } }
}
class Derived : Base
{
public new string CorrectName { get { return "NEW" + Name; } }
}
static void Main(string[] args)
{
List<Derived> container = new List<Derived>();
var d = new Derived() { Name = "NameDerived2" };
container.Add(d);
Search<Derived>(container);
Console.ReadLine();
}
static void Search<T>(List<T> list) where T : Base
{
foreach (var el in list)
{
Console.WriteLine("No Cast -->" + el.CorrectName);
Console.WriteLine("Generic Cast -->" + (el as T).CorrectName);
Console.WriteLine("Direct Cast -->" + (el as Derived).CorrectName);
}
}
输出:
No Cast -->NameDerived2
Generic Cast -->NameDerived2
Direct Cast -->NEWNameDerived2
真相表:
el is Derived == true
el.GetType().Equals(typeof(Derived)) == true
el.GetType().Equals(typeof(T)) == true
el.GetType().Equals(typeof(Base)) == false
typeof(T).Equals(typeof(Base)) == false
typeof(T).Equals(typeof(Derived)) == true