我有一个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>
。
请告知。
由于
答案 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;
}
}
}