gpt4 book ai didi

c# - 在这种假设情况下,是否有可能在 C# < 4 中围绕泛型协方差进行最终运行?

转载 作者:行者123 更新时间:2023-11-30 14:19:25 25 4
gpt4 key购买 nike

假设我有一个小的 Animals 继承层次结构:

public interface IAnimal {
string Speak();
}

public class Animal : IAnimal {
public Animal() {}
public string Speak() {
return "[Animal] Growl!";
}
}

public class Ape : IAnimal {
public string Speak() {
return "[Ape] Rawrrrrrrr!";
}
}

public class Bat : IAnimal {
public string Speak() {
return "[Bat] Screeeeeee!";
}
}

接下来,这是一个界面,提供了一种方法来转换 strings进入IAnimals .

public interface ITransmogrifier<T> where T : IAnimal {
T Transmogrify(string s);
}

最后,这里有一个策略:

public class Transmogrifier<T> : ITransmogrifier<T> where T : IAnimal, new() {
public T Transmogrify(string s) {
T t = default(T);
if (typeof(T).Name == s)
t = new T();
return t;
}
}

现在,问题。是否可以替换标记为 [1]、[2] 和 [3] 的部分,以便该程序能够正确编译和运行?如果你不接触 [1]、[2] 和 [3] 以外的部分就做不到,你还能得到 IAnimal 吗?来自 Transmogrifier 的每个实例在包含 IAnimal 的任意实现的集合中?你甚至可以开始形成这样的集合吗?

    static void Main(string[] args) {
var t = new Transmogrifier<Ape>();
Ape a = t.Transmogrify("Ape");
Console.WriteLine(a.Speak()); // Works!

// But can we make an arbitrary collection of such animals?
var list = new List<Transmogrifier< [1] >>() {
// [2]
};

// And how about we call Transmogrify() on each one?
foreach (/* [3] */ transmogrifier in list) {
IAnimal ia = transmogrifier.Transmogrify("Bat");
}
}
}

最佳答案

李是对的。

正如您在问题中暗示的那样,您可以在 C# 4 中通过将 ITransmogrifier 标记为 T 中的协变(“out”)来执行此操作。然后您可以制作 List<ITransmogrifier<IAnimal>>并放一个 Transmogrifier<Bat>进入该列表。

关于c# - 在这种假设情况下,是否有可能在 C# < 4 中围绕泛型协方差进行最终运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2790276/

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