gpt4 book ai didi

.net - 什么时候确定泛型类型?可以影响吗?

转载 作者:行者123 更新时间:2023-12-04 07:28:35 24 4
gpt4 key购买 nike

我一直在玩泛型,我看到了一些奇怪的东西。希望大家给个解释!为了让一切变得更容易,我把“问题”放到了一个例子中:

namespace Lab
{
public class Animal
{
public Animal(string sound)
{
this.Sound = sound;
}

public string Sound { get; private set; }

public void Kick()
{
Printer.Print(this, Sound);
}
}

public class Dog : Animal
{
public Dog() : base("Bark, bark! I'll bite you!") { }
}

public class Printer
{
public static void Print<T>(T obj, string message)
{
System.Console.WriteLine("{0} says '{1}' \n", typeof(T).FullName.PadRight(10), message);
}
}

public static class Program
{
static void Main(string[] args)
{
Animal bird = new Animal("Tweet!");
Dog dog = new Dog();

System.Console.WriteLine("Kick bird:");
bird.Kick();
System.Console.WriteLine("Kick dog:");
dog.Kick();
System.Console.WriteLine("Print kick dog:");
Printer.Print(dog, dog.Sound);

System.Console.ReadLine();
}
}
}

所以,我的实验室里有两只动物:一只狗和一只鸟。当我“踢”那些动物时,它们会发出声音。打印机将打印声音和动物类型。当我运行程序时,它会打印:

Kick bird: Lab.Animal says 'Tweet!'

Kick dog: Lab.Animal says 'Bark, bark! I'll bite you!'

Print kick dog: Lab.Dog says 'Bark, bark! I'll bite you!'



为什么狗的第一脚踢告诉我它是类型 Lab.Animal ?
还有……我怎样才能让它返回Lab.Dog ?

最佳答案

狗的第一脚告诉您类型参数的编译时类型是 Lab.Animal。换句话说,您的 Animal.Kick方法是有效的:

Printer.Print<Animal>(this, Sound);

类型参数不是多态确定的——它们是在编译时确定的。当一个调用的类型参数实际上是调用上下文的类型参数时,它变得更加复杂,但它基本上是同一类东西。

说起来 Lab.Dog ,您必须获得对象的实际执行时间类型,例如使用
obj.GetType().FullName

关于.net - 什么时候确定泛型类型?可以影响吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5153554/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com