我需要向我解释一些我不了解的泛型类类型。
让我们以下面的愚蠢方法为例:
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;
}
}
反正有没有像这样的功能?我想知道是否有办法设置它以便我说。 “这个函数返回一个列表。我不确定它将返回什么类型的列表,但它肯定会是一个列表。
答案 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;
}
}
其他一些可能的选择是object
,IEnumerable
和ICollection
答案 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>(); }
}
虽然很傻,但它确实符合您概述的要求。虽然它实际上只是标准的多态性。