c#中泛型类的奇怪命名空间类型



我有一个c#程序,有以下问题(我想是新手):

namespace ObjectReference
{
    public class A<TypeC>
    {
        public B b;
        public void MethodA()
        {
            b = new B(this);
        }
    }
}

和在同一项目的不同文件中:

namespace ObjectReference    
{    
    public class B    
    {   
        public A<TypeC> a;
        public B(A<TypeC> myObjA)    
        {    
            a = myObjA;   
        }
    }    
}

在定义类A的文件中,我在行" b = new B(this); ": "Argument 1: cannot convert from 'ObjectReference.A<TypeC>' to 'ObjectReference.A<ObjectReference.TypeC>'"上得到这个错误。

我已经尝试了一切,我无法解决这个问题,我不明白为什么它出现了,所有的类都定义在相同的命名空间ObjectReference(即类A, B和TypeC)。就像在A类中,它认为类的类型是ObjectReference.A<TypeC>,而在B类中,它认为类型是ObjectReference.A<ObjectReference.TypeC>

请建议。

谢谢

你写的内容相当于:

public class A<T>
{
    public B b;
    public void MethodA()
    {
        b = new B(this);
    }
}
public class B    
{   
    public A<TypeC> a;
    public B(A<TypeC> myObjA)    
    {    
        a = myObjA;   
    }
} 

注意我把A类写成A<T>而不是A<TypeC>。即使你设置了一个有效的类型名,它也是一个合法的c#泛型,所以在类a的定义中,TypeCTypeC是不一样的。因此,您得到的错误消息。

要使这个工作,你需要这样做:

public class A<T>
{
    public B<T> b;
    public void MethodA()
    {
        b = new B<T>(this);
    }
}
public class B<T> 
{   
    public A<T> a;
    public B(A<T> myObjA)    
    {    
        a = myObjA;   
    }
}    

然后你可以像这样调用代码:

var a = new A<TypeC>();
a.MethodA();

您试图告诉类B有一个构造函数接受类型a的实例,而不需要任何类型规范。您可以像类a一样更新类B,接受类型参数:

public class B<T>
{
    ...
} 

或者可以使类b的构造函数更具体,为它指定类型参数,如:

public B(A<string> myObjA)
{
    a = myObjA;
} 

关于这个类型参数的更多信息,我建议您查找一些关于泛型的信息。那里有大量的书籍和文章!

编辑

我看到你更新了代码。这仍然是不够的,除非type c是你没有给我们的实际类型。然而,这将是一个非常难以理解的命名场景。基本上,在类A中,您定义了一个泛型类型参数,该参数可以在名称TypeC下指定,而在类B中,您假定存在一个具有此名称的类型。我还是建议你读一些关于泛型的书。

您试图将a的泛型实现传递给B的构造函数,该构造函数采用a的非泛型实现。不幸的是,这不起作用,并且需要对类B进行一些重写。

可以这样写:

namespace ObjectReference
{
    public class B<TypeC>
    {
        public A<TypeC> a;
        public B(A<TypeC> myObjA) 
        {
            a = myObjA;
        }
    }
 }

,然后调用为:

b = new B<TypeC>(this);

A<TypeC>是所谓的开放泛型类型,不能作为方法参数传递。

要解决这个问题,你需要使B通用。在B<TypeC>中使用A<TypeC>现在使A<TypeC>成为一个构造的开放泛型类型。这仅仅意味着B的泛型类型参数被"派生"为A<TypeC>

你可能想看看MSDN关于c#中泛型类的页面。

namespace ObjectReference    
{    
    public class B<TypeC>    
    {   
        public A<TypeC> a;
        public B(A<TypeC> myObjA)    
        {    
            a = myObjA;   
        }
    }    
}

最新更新