Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';s是Java的C#等价物';s级<;X>;类型?_C#_Generics - Fatal编程技术网

什么';s是Java的C#等价物';s级<;X>;类型?

什么';s是Java的C#等价物';s级<;X>;类型?,c#,generics,C#,Generics,在Java中,类有泛型参数X是很方便的,但是C#的类型类没有这个参数 那么,在C#中,如何等效于以下Java代码: public <X> X methodThatReturns(Class<X> clazz) { ... } public X方法返回(类clazz){…} 在C#中似乎没有一种方法可以连接返回值和传递的类型 澄清 有几个答案表明method参数不是必需的,因为该方法可以简单地定义为methodThatReturns() 但是如果您确实有一些未知类型的变

在Java中,类有泛型参数X是很方便的,但是C#的类型类没有这个参数

那么,在C#中,如何等效于以下Java代码:

public <X> X methodThatReturns(Class<X> clazz) { ... }
public X方法返回(类clazz){…}
在C#中似乎没有一种方法可以连接返回值和传递的类型

澄清
有几个答案表明method参数不是必需的,因为该方法可以简单地定义为
methodThatReturns()

但是如果您确实有一些未知类型的变量,
t
,基本上没有办法调用这样一个泛型方法,以便它返回类型为
t
的对象

在Java中,您可以自由地传递
Class
变量,而不会丢失类型信息,但在C中,如果您传递等价的
type
变量,您可能会遇到限制,因为在需要调用泛型方法时无法使用它们

public X methodThatReturns<X>(Class<X> clazz) { ... }
编辑:

同样,由于编译后不会丢失泛型类型信息,因此无需显式传入类型:

public X methodThatReturns<X>()
{
    Type xType = typeof(X); // Type is to C#/.Net what Class<X> is to Java.
}
public X methodThatReturns()
{
Type xType=typeof(X);//Type对于C#/.Net就像类对于Java一样。
}
在C语言中#应该是

public X methodThatReturns<X>() { ... }
public X methodThatReturns(){…}

您可以使用
typeof(X)
来获得X的类型,而不是使用参数
clazz

我不是100%支持Java泛型。。。您是否试图声明一个返回与传递的方法相同类型的方法

public T MethodThatReturns<T>(T input) { ... }
请注意,对MethodThatReturns的调用没有
,编译器可以在给定您传递的参数的情况下找到它。但是,请注意,这是编译器完成的,而不是运行时,因此它将只使用变量foo的类型,而不是foo指向的对象的类型


另一方面,如果这是一个不带“实”参数的方法的Java语法,那么只需:

public T MethodThatReturns<T>()
{
    Type clazz = typeof(T);
    ....
}
public T方法返回()
{
clazz型=T型;
....
}

在这个方法中,您可以像对待任何其他类一样对待T,它将专门引用调用该方法的类型,而不是to
object
或类似的类型。您可能希望将
置于其中T:class
以允许该方法中的比较为null(这会阻止您使用
int
作为泛型类型),或者
置于其中T:new()
以限制泛型类型具有默认构造函数,因此您可以执行
T foo=new T()

我对Java和.NET泛型都很熟悉,我在Java项目中经常使用
构造。我最喜欢的用途之一是处理Java中从外部代码(如Hibernate)返回的非泛型集合(我认为Hibernate的最新版本可能支持泛型,但我不确定。我们使用的是它的一个相当旧的版本,因为它是一个长期运行的项目,如果我们更改它,需要更新太多的代码。)函数的工作原理如下:

public <X> List<X> TypedList(List<?> lst, Class<X> cls) {
    return (List<X>) lst;
}
public List<X> TypedList<X>(IList lst)
{
    return (List<X>) lst;
}
原因是
List
List
被认为是两个完全不同的类。您甚至不能执行
List lstObj=(List)new List();
不会出现编译器错误。这意味着函数无法返回传递给它的相同对象。我们必须创建一个正确类型的新对象并返回该对象。最基本的形式如下所示:

public List<X> TypedList<X>(IList lst)
{
    List<X> lstOut = new List<X>();
    for (int i = 0; i < lst.Count; i++)
    {
        if (lst[i] is X) lstOut.Add((X) lst[i]);
    }
    return lstOut;
}
public List<X> TypedList<X>(IList lst)
{
    return lst.OfType<X>().ToList();
}
[注意:如果您不熟悉
lng=>lng.ToString()
部分,则称之为Lambda表达式。]

Cast()
与类型()的
不同,实际上尝试将每个项转换为int,跳过任何无法转换的项。
Select()
只允许您使用几乎任何类型的代码,从现有集合构建一个全新的集合


我希望我的真实例子能帮助人们更好地理解.NET和Java在使用泛型类型函数时的区别。

我不是一个很好的C#程序员,但我认为这个习惯用法在C#中不太常见,因为C#没有类型擦除。泛型类型信息在运行时会被保留,而不是丢失。不是吗nk@slattery有一个。注意:泛型是从.NET 2.0/C#2/Visual Studio 2005开始添加的。如果您使用的是.NET 1.1/C#1.2/Visual Studio 2002/2003,您就不走运了。谢谢Ivan,但我正在寻找您的方法来获取“类型”将X作为参数,而不是X的实例…类似于类型。无法将其作为参数,但在C#中,您不需要这样做,因为您可以在方法内部这样做,即使它没有参数:
Type X=typeof(X)
.Type相当于C#中的类。这是非常不幸的。无法通过传入类型表示动态返回类型并获取编译器类型检查对于某些情况来说是非常有限的。有趣的阅读。我很高兴您发现这些LINQ方法在您当前的情况下很有用。我不认为有什么特别的隐藏但是,在我意识到已经有了一个内置的类型扩展方法之前,我实际上创建了自己的类型扩展方法。从列表到列表的局限性可能更多地与类型差异有关。我仍然在使用C#3.5,但我认为4.0引入了更多的支持(就像协方差和逆变换的'in'和'out'关键字)。@slattery实际上,方差不适用于类,只适用于接口和委托。List确实实现了IEnumerable,这是协变的,因此您可以执行类似于
IEnumerable enumObj=new List();
的操作,但您仍然无法转到
List lstObj=(List)enumObj;
没有强制转换异常,因为具体类型始终是List
public List<X> TypedList<X>(IList lst)
{
    return (List<X>) lst;
}
List<object> lstObj = TypedList<object>(new List<string>());
public List<X> TypedList<X>(IList lst)
{
    List<X> lstOut = new List<X>();
    for (int i = 0; i < lst.Count; i++)
    {
        if (lst[i] is X) lstOut.Add((X) lst[i]);
    }
    return lstOut;
}
public List<X> TypedList<X>(IList lst)
{
    return lst.OfType<X>().ToList();
}
List<long> lstLng = new List<long>();
lstLng.Add(1);
List<int> lstInt = lstLng.Cast<int>().ToList();
List<string> lstStr = lstLng.Select(lng => lng.ToString()).ToList();