返回通用类型而不指定类型参数

时间:2013-10-13 02:14:28

标签: 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)
        {
            case 1: var StringList = new List<string>{ "Test" };
                return StringList;

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

反正有没有像这样的功能?我想知道是否有办法设置它以便我说。 “这个函数返回一个列表。我不确定它将返回什么类型的列表,但它肯定会是一个列表。

5 个答案:

答案 0 :(得分:4)

要执行此操作,您必须返回一个类型,该类型对于您的返回对象可能具有的所有可能选项是通用的,对于这两个列表,您可以为此情况返回最佳选项IList

public IList RandomList()
{
    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;
    }
}

其他一些可能的选择是objectIEnumerableICollection

答案 1 :(得分:3)

原则上,在C#语言中,specified,你不能这样做。

参见K.4.2打开和关闭类型(Extracted Relevant Paragraph)

  

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

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

如果您想要一致的外部视图,那么Interfaces就是您的选择。这里IList可以很好地运作。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

总的来说,我同意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;
            }
        }

这意味着您必须考虑在编译时将与该类一起使用的所有泛型类型。您也可以使用“动态”类型来执行此操作。

答案 4 :(得分:0)

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

考虑以下定义:

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>(); }

}

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