是否有一个「;“匿名”;C#中的泛型标记,如'';在爪哇?

是否有一个「;“匿名”;C#中的泛型标记,如'';在爪哇?,c#,generics,syntax,C#,Generics,Syntax,在Java中,可以声明由“未知”泛型类型参数化的变量,如下所示: Foo<?> x; Foo t = new Foo<int>(); foox; 这个问号在C#中是否有一个等价的结构?不,在C#中实际上没有相同的概念。您需要引用Foo的基类(可能是非泛型Foo),或者使您正在使用的方法本身具有泛型(以便您可以引用Foo,并让方法的调用方确定T是什么) 希望能有所帮助。在C#中没有等效的语法。好吧,在C#中你不能这样做。BCL所做的和大量的例子是创建一个非泛型的类,然

在Java中,可以声明由“未知”泛型类型参数化的变量,如下所示:

Foo<?> x;
Foo t = new Foo<int>();
foox;

这个问号在C#中是否有一个等价的结构?

不,在C#中实际上没有相同的概念。您需要引用Foo的基类(可能是非泛型Foo),或者使您正在使用的方法本身具有泛型(以便您可以引用Foo,并让方法的调用方确定T是什么)


希望能有所帮助。

在C#中没有等效的语法。

好吧,在C#中你不能这样做。BCL所做的和大量的例子是创建一个非泛型的类,然后创建一个从上一个继承基本行为的泛型类。见下面的例子

class Foo
{
}

class Foo<T> : Foo
{
}
class-Foo
{
}
Foo类:Foo
{
}
你可以这样写:

Foo<?> x;
Foo t = new Foo<int>();
foot=newfoo();

简短的回答是否定的。C#中没有同等的功能

解决方法,由Dare Obasanjo提供:

在某些情况下,可能需要创建一个方法,该方法可以在包含任何类型的数据结构上操作,而不是在包含特定类型的数据结构上操作(例如,打印数据结构中所有对象的方法),同时仍然可以利用泛型中强类型的优点。在C#中指定这一点的机制是通过一个称为泛型类型推断的特性,而在Java中,这是使用通配符类型完成的。下面的代码示例显示了两种方法如何导致相同的结果

C#代码

使用系统;
使用系统集合;
使用System.Collections.Generic;
课堂测试{
//按打印任何常规堆栈的内容
//使用泛型类型推断
公共静态无效打印堆栈内容(堆栈){
而(s.Count!=0){
Console.WriteLine(s.Pop());
} 
}
公共静态void Main(字符串[]args){
堆栈s2=新堆栈();
s2.推(4);
s2.推(5);
s2.推(6);
打印内容(s2);
堆栈s1=新堆栈();
s1.推动(“一”);
s1.推动(“两”);
s1.推(“三”);
打印内容(s1);
}
}
Java代码

import java.util.*; 

class Test{

    //Prints the contents of any generic Stack by 
    //specifying wildcard type 
    public static void PrintStackContents(Stack<?> s){
        while(!s.empty()){
            System.out.println(s.pop()); 
        }
    }

    public static void main(String[] args){

    Stack <Integer> s2 = new Stack <Integer>(); 
    s2.push(4); 
    s2.push(5); 
    s2.push(6); 

    PrintStackContents(s2);     

    Stack<String> s1 = new Stack<String>(); 
    s1.push("One"); 
    s1.push("Two"); 
    s1.push("Three");   

    PrintStackContents(s1); 
    }
}
import java.util.*;
课堂测试{
//按打印任何常规堆栈的内容
//指定通配符类型
公共静态无效打印堆栈内容(堆栈){
而(!s.empty()){
System.out.println(s.pop());
}
}
公共静态void main(字符串[]args){
堆栈s2=新堆栈();
s2.推(4);
s2.推(5);
s2.推(6);
打印内容(s2);
堆栈s1=新堆栈();
s1.推动(“一”);
s1.推动(“两”);
s1.推(“三”);
打印内容(s1);
}
}
在C#中没有等价物(相当)是不正确的。没有可以用作类型或调用方法的静态等价物。为此,请使用

另一方面,有时你需要一个等价的想法来进行反思,而这是一个等价的想法。如果您有:

interface IFoo<T>
{
  T Bar(T t, int n);
}

诚然,虽然不是干净的方法,但使用
foox
也可能是合适的。

最终解决的模板类型是什么?类C的推理在Java 6中也有效。那么Java中还有使用吗?这实际上并没有回答这个问题。答案是“不”。上面显示的技巧演示了一种在C#中实现Java捕获转换的变通方法,该方法与方法调用转换一起工作,但在赋值转换或强制转换表达式中不会有用。事实上,这个答案是我见过的最长的表示“不”的方式:)好,好。我在开头添加了“否”。)伙计们,你们知道你们可以编辑我的答案,对吧?不应该称之为“变通方法”,因为它不是。这只是一个例子,不是吗?-1:使用
对象
将泛型类型限制为所有具有通用超类
对象
的类型。适用于所有类型:原语、类对象、结构、枚举<代码>列表=新列表();增加第(1)款;添加(newdatetime());添加(newmystruct());list.Add(MyEnum.Enum1)
@Dani,
列表。将
框中的任何结构类型添加到
Nullable
s中,因此marc的注释仍然有效。不幸的是,当存在类型限制时,这不起作用。此答案立即解决了我的问题。我调用了一个泛型方法,完全忽略了返回值,所以我更不关心返回类型。使用
对象
非常适合我+1.