C# 带泛型的静态方法

C# 带泛型的静态方法,c#,generics,static-methods,C#,Generics,Static Methods,在java中,我有一个类: 静态公共类PCB_节点实现Iterable{ 公营部门及家长; 第一个孩子; 公共的下一个兄弟; 公共迭代器迭代器(){ 返回get_迭代器((T)this); } } 静态公共迭代器get_迭代器(te){ ... } 我尝试将此移植到c#,在这方面我几乎没有经验 我对类的定义如下: public class PCB_Node<T> : IEnumerable<T> where T : PCB_Node<T> { pub

在java中,我有一个类:

静态公共类PCB_节点实现Iterable{
公营部门及家长;
第一个孩子;
公共的下一个兄弟;
公共迭代器迭代器(){
返回get_迭代器((T)this);
}
}
静态公共迭代器get_迭代器(te){
...
}
我尝试将此移植到c#,在这方面我几乎没有经验

我对类的定义如下:

public class PCB_Node<T> : IEnumerable<T> where T : PCB_Node<T>
{
    public IEnumerator<T> GetEnumerator() => get_iterator(this);

    public static IEnumerator<T> get_iterator(PCB_Node<T> node)
    {
        //...
    }
}
public IEnumerator<T> GetEnumerator() => AnotherClass.get_iterator(this);
公共类PCB_节点,其中T:PCB_节点,IEnumerable{
公营部门及家长;
第一个孩子;
公共的下一个兄弟;
公共IEnumerator GetEnumerator(){

返回get_迭代器((T)this);//首先,您的类声明不正确

这里您是说
T
必须是
PCB\u节点
实现
IEnumerable

虽然
T
PCB_节点
,但属于
PCB_节点
类型的不一定是
T
,在本例中会导致运行时异常:

class DerivedNode : PCB_Node<DerivedNode> { }

var node = new PCB_Node<DerivedNode>();
var enumerator = node.GetEnumerator(); // InvalidCastException
如果在另一个类中声明了
get\u iterator
,则需要重新应用约束:

public class AnotherClass
{
    public static IEnumerator<T> get_iterator<T>(PCB_Node<T> node) where T : PCB_Node<T>
    {
        //...
    }
}
公共类另一类
{
公共静态IEnumerator get_迭代器(PCB_节点),其中T:PCB_节点
{
//...
}
}
然后这样称呼:

public class PCB_Node<T> : IEnumerable<T> where T : PCB_Node<T>
{
    public IEnumerator<T> GetEnumerator() => get_iterator(this);

    public static IEnumerator<T> get_iterator(PCB_Node<T> node)
    {
        //...
    }
}
public IEnumerator<T> GetEnumerator() => AnotherClass.get_iterator(this);
public IEnumerator GetEnumerator()=>另一个类。get_迭代器(此);

您可能需要以下声明:

public class PCB_Node<T> : IEnumerable<T> where T : PCB_Node<T>
公共类PCB\u节点:IEnumerable其中T:PCB\u节点
也就是说,您的PCB_节点是IEnumerable,并且T必须是同一种PCB_节点

我不熟悉java中的静态类,但我猜您需要一个常规类

要实现IEnumerable,可以使用:

public IEnumerator GetEnumerator()
{
回报这个
//添加迭代逻辑
}
IEnumerator IEnumerable.GetEnumerator()
{
返回GetEnumerator();
}
我将考虑将迭代器与类分开,因为树可以用几种不同的方式迭代。例如,通过使用扩展方法:

public static IEnumerable<T> DepthFirst<T>(this PCB_Node<T> root) where T : PCB_Node<T>
{
    yield return root;
    // add iteration logic
}
公共静态IEnumerable DepthFirst(此PCB_节点根),其中T:PCB_节点
{
产量回归根;
//添加迭代逻辑
}

@AluanHaddad No C sharp类不能是静态的,因为我需要能够创建实例。很抱歉,我总是忘记
静态的
只适用于嵌套的classes@AluanHaddad没问题,我的朋友我尝试了你在另一个类中使用的静态方法,但是我得到了:“找不到类型或命名空间名称'T'(您是否缺少using指令或程序集引用?)“@clankill3r抱歉;输入错误。您需要将该方法声明为泛型,即
get\u迭代器
。该死,您的响应速度很快:D
    public IEnumerator<T> GetEnumerator()
    {
        yield return this
        // add iteration logic
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
public static IEnumerable<T> DepthFirst<T>(this PCB_Node<T> root) where T : PCB_Node<T>
{
    yield return root;
    // add iteration logic
}