誰でもこの問題を説明できますか?
これを機能させる唯一の方法は、新しいキーワードの代わりに、CorrectName で virtual を使用してから 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