昨天,我向 friend 们解释了C#的通用约束。在演示where T : CLASSNAME约束时,我提出了类似以下内容:

public class UnusableClass<T> where T : UnusableClass<T>
{
    public static int method(T input){
        return 0;
    }
}

看到它可以编译真的很惊讶。但是,经过一番思考,从编译器的角度来看,我认为这是完全合法的-UnusableClass<T>与可在此约束中使用的任何其他类一样多。

但是,这留下了两个问题:如何使用此类?是否有可能
  • 实例化吗?
  • 继承吗?
  • 调用其静态方法int method吗?

  • 而且,如果是,怎么办?

    如果有任何可能,T的类型是什么?

    最佳答案

    出色地。

    public class Implementation : UnusableClass<Implementation>
    {
    }
    

    是完全有效的,因此
    var unusable = new UnusableClass<Implementation>();
    


    UnusableClass<Implementation>.method(new Implementation());
    

    有效的。

    因此,是的,可以通过提供一个继承类型作为type参数来实例化,并且与对static方法的调用类似。例如,它对于树状结构很有用,您需要在该树状结构中通常指定节点具有的子级类型,而节点本身的类型相同。

    10-06 06:06