我有一个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的定义中,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;
}
}
然后你可以像这样调用代码:
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;
}
}
}