C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了在这个假设的情况下,是否有可能在C#<4中围绕泛型协方差进行最终运行?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
假设我有一个小的动物继承层次结构:

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!";
    }
}

接下来,这是一个提供将字符串转换为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");
        }
    }
}

解决方法

你不能这样做,因为Transmorgifier< Ape>之间没有类型关系.和Transmorgifier< Bat>所以你不能把它们放在同一个通用列表中(List< object>除外).显而易见的解决方案只是使ITransmorgifier非泛型:

public interface ITransmogrifier
{
    IAnimal Transmogrify(string s);
}

那你就可以了

var list = new List<ITransmogrifier>() {
    new Transmorgifier<Ape>(),new Transmorgifier<Bat>() ...
};

大佬总结

以上是大佬教程为你收集整理的在这个假设的情况下,是否有可能在C#<4中围绕泛型协方差进行最终运行?全部内容,希望文章能够帮你解决在这个假设的情况下,是否有可能在C#<4中围绕泛型协方差进行最终运行?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: