使用泛型类C#键入奇怪的命名空间

时间:2011-10-19 10:00:58

标签: c# generics namespaces

我有一个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>

请告知。

由于

4 个答案:

答案 0 :(得分:2)

你所写的内容相当于:

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 [{1}}的定义中与类TypeC不同。因此,您收到的错误消息。

要完成这项工作,您需要执行以下操作:

TypeC

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

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;   
    }
}    

我希望这会有所帮助。

答案 1 :(得分:1)

您正在尝试告诉B类构造函数接受类型A的实例而没有任何类型规范。您可以像接受类A:

一样更新接受类型参数的B类
public class B<T>
{
    ...
} 

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

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

有关此类型参数的详细信息,我建议您查找有关泛型的一些信息。那里有大量的书籍和文章!

修改

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

答案 2 :(得分:1)

您正在尝试将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);

答案 3 :(得分:0)

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

要解决此问题,您还需要B通用。在A<TypeC>中使用B<TypeC>现在使A<TypeC>成为构造的开放泛型类型。这只意味着B的泛型类型参数“派生”到A<TypeC>

您可能需要查看MSDN page about generic classes in C#

namespace ObjectReference    
{    
    public class B<TypeC>    
    {   
        public A<TypeC> a;

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