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