C#模仿Java泛型?

C#模仿Java泛型?,c#,generics,unity3d,C#,Generics,Unity3d,在Java中,这是有效的: class Class1<T extends OtherType> { T t; ... } //Inside other class that has no relation to Class1 private Class1 class1; //No type needed public void someOtherFunction (Class1 class1) //Works { this.class1 = class1; //M

在Java中,这是有效的:

class Class1<T extends OtherType> { T t; ... }

//Inside other class that has no relation to Class1
private Class1 class1; //No type needed

public void someOtherFunction (Class1 class1) //Works  
{  
    this.class1 = class1; //May warn about invalid type casting
    class1.someFunction();
}
您的java代码是“有效的”,因为java中的所有泛型实际上都是非泛型的,因为java的泛型只是编译时技巧,没有任何运行时支持

对于java运行时,类型
A
实际上是
A
,没有类型参数,因为java运行时根本不支持泛型

相比之下,.NET CLR内置了对运行时泛型类型的支持,因此它区分了类型
a
和泛型类型
a

在C#中,如果您想要类型
Class1
的非泛型版本,只需声明它:

class Class1
{
    //Whatever members that don't require a type parameter,

    void SomeFunction() { /* ... */ } // Please use proper casing.
}
然后,如果需要此类的通用版本:

class Class1<T>: Class1
{
    T Content { get; set; }
}

请注意,C#方法更安全,如果使用非泛型版本,则只能访问在非泛型版本中定义的类成员,而不需要类型参数。相反,java是完全不安全的,由于泛型中缺乏真正的类型安全性,可能会产生可怕的运行时错误。

class
object
在C#中保留;不要将它们用作变量名。@EricLippert我知道,我现在就修复它。谢谢。我不知道Java是如何工作的,但在.NET中,具有不同类型参数的泛型类型实际上是不同的类型。这些“构造的泛型类型”是由编译器生成的,因此,类型参数必须在编译时已知。所以我不认为以你写的方式使用它是可能的。有关更多信息,请参见MSDN:Since
someFunction
使用
T
您希望它知道类型的魔力是什么?(如果
someFunction
不使用
T
,它将位于
Class1
的非泛型基类中,因此我认为我的假设是合理的)您实际上是想实现一个泛型类,还是想实现一个从泛型派生的类?@AndrewNo我正在查看您刚才添加到问题中的代码,我不认为这需要太多的重写。我甚至不认为它需要泛型。只是一个接口。所有玩家都应该是
IPlayer
,所有武器都应该是
IWeapon
@mason,事实上,这是不等价的,因为T必须在非泛型类中声明为变量,这违背了它的目的。@mason,一个接口!我没想到。我会做些改变,稍后再汇报。谢谢你。@mason,接口不起作用。我会更新我的问题,解释为什么。@Andrewn它没有解决你最初提出的问题,我想这就是为什么你接受了答案(我相信你接受了,然后又不接受了?)。你现在有一个新问题要问,所以做正确的事情,问一个新问题,而不是改变这个问题。
class Class1
{
    //Whatever members that don't require a type parameter,

    void SomeFunction() { /* ... */ } // Please use proper casing.
}
class Class1<T>: Class1
{
    T Content { get; set; }
}
class Example
{
    Class1 instance; // Valid

    public void someOtherFunction (Class1 class1) //Works  
    {  
        this.instance = class1; //Does not warn about anything because this is type safe.
        class1.SomeFunction(); // Works

        var content = class1.Content // Compile Error: type class1 does not have such member "Content"
    }
}