C# 返回泛型类型而不指定类型参数

C# 返回泛型类型而不指定类型参数,c#,generics,C#,Generics,关于泛型类类型,有一些我不理解的地方需要向我解释 让我们以以下愚蠢的方法为例: public List<> RandomList() //Note that the Compiler yells at you for not giving a type parameter { var RandObj = new Random(); var myint = RandObj.Next(1,3); switch(myint

关于泛型类类型,有一些我不理解的地方需要向我解释

让我们以以下愚蠢的方法为例:

    public List<> RandomList()  //Note that the Compiler yells at you for not giving a type parameter
    {
        var RandObj = new Random();
        var myint = RandObj.Next(1,3);

        switch(myint)
        {
            case 1: var StringList = new List<string>{ "Test" };
                return StringList;

            case 2: var IntList = new List<int>{ 1,2,3,4 };
                return IntList;
        }
    }

有没有办法让这样的函数工作?我想知道是否有一种方法可以把它设置成我所说的那样。此函数返回一个列表。我不确定它将返回什么类型的列表,但它肯定是一个列表。

不。List是泛型类型定义,但不是真正的类型,因为它只能用于反射目的。它们应该被称为C++中的模板:p

这样做,你必须返回一个类型,这是你返回对象可能的所有选项中常见的,对于两个列表,你可以返回最佳的选项,ILIST/P>
原则上,在C语言中,其他一些可能的选择是object、IEnumerable和ICollection,因为您不能这样做

见K.4.2相关段落中的打开和关闭类型

在运行时,泛型类型声明中的所有代码都是 在创建的封闭构造类型的上下文中执行 通过将类型参数应用于泛型声明。每种类型 泛型类型中的参数绑定到特定的运行时 类型所有语句和表达式的运行时处理始终 与关闭类型一起发生,而打开类型仅在 编译时处理

编译器需要能够将所有打开类型转换为关闭类型。因此它抱怨


如果您想要一个一致的外部视图,那么这是一条路要走。这里可以很好地工作。

总的来说,我同意SH的观点,因为C确实不是设计用来做这件事的。你可以不完美地伪造这个

    public IList<T> RandomList<T>() {
        T targetType = default(T);
        var RandObj = new Random();
        switch(targetType.GetType().Name) {
            case "String": 
                var StringList = new List<string>{ "Test" };
                return (IList<T>) StringList;

            case "Int32": 
                var IntList = new List<int>{ 1,2,3,4 };
                return (IList<T>) IntList;

            default:
                return null;
            }
        }

这样做意味着您必须考虑编译时将用于类的所有泛型类型。您还可以使用“动态”类型来执行此操作。

虽然不可能使用您不控制的泛型类型,但只要您可以控制对象层次结构,就可以执行类似的操作

考虑以下定义:

public class Number { };
public class Number<T>: Number {};

public static class NumberGenerator {

   public static Number Generate ( double value ) { return new Number<double>(); }
   public static Number Generate ( int value ) { return new Number<int>(); }

}

虽然很傻,但它确实满足了您概述的要求。虽然它实际上只是标准的多态性。

List但这并不可取……这更是我好奇的原则。我现在没有一个具体的实现,但这个问题一直困扰着我。首先,它永远不会进入案例2,下一个方法的第二个参数不包含它的唯一含义,对于您的案例,您需要执行RandObj.Next1,3;。。。哈哈,编辑:谢谢。我从来没有真正使用过随机,我只是把它放在这里来表达我的想法,但现在我知道了=很好,这有助于解释我需要知道的。如果将来我创建了一个泛型类型,我想用它来做类似的事情,我需要确保泛型类型实现了一个非泛型接口,我可以用它作为返回值。在哪一点没有被宣布?何时调用该函数?调用是什么样子的?当您调用函数时,可以对其进行专门化,例如:var lst=RandomList;Console.WriteLinelst.Count;
public class Number { };
public class Number<T>: Number {};

public static class NumberGenerator {

   public static Number Generate ( double value ) { return new Number<double>(); }
   public static Number Generate ( int value ) { return new Number<int>(); }

}