2012-02-22 111 views
2

我有下面的代码返回错误“‘对象’不包含一个构造函数X的参数。”在试图调用基构造函数的行上。调用构造函数的基础工作不C#

解决方案1,项目1

namespace Project.Sub.A 
{ 
    internal class Foo 
    { 
    internal Foo(int a, long b) {} 

    } 
} 

解决方案1,项目2

namespace Project.Sub.B{ 
    internal class Bar : Foo 
    { 
    internal Bar(int a, long b,long c) :base(a,b+c) {} 

    } 
} 

我不知道为什么,这并不想要的工作。可能是我的命名空间配置不正确?

回答

8

internal访问是根据程序集,而不是命名空间。

因为在基类的构造函数声明为internal,它不是在其他项目中的子类访问。尝试将其更改为protected internal,或只是protected

更新

只注意到基类也internal。如果您希望在第二个项目中看到它,您需要制作它public。或者,您可以在Project1中的AssemblyInfo.cs中添加[assembly:InternalsVisibleTo("Project2")]。 (我不会亲自推荐该选项,虽然)。

+0

我想这一点,但没有运气。 – Vort3x 2012-02-22 14:14:49

+0

你怎么知道它在另一个项目? – Jon 2012-02-22 14:15:01

+4

@乔恩,因为他是这样说的......解决方法1,计划2 – 2012-02-22 14:15:35

2

内部手段visible to other classes in the current assembly

因为你在第二个项目定义你的第二个类,它看不到的基础构造。

尝试制作两个Foo类&构造函数protected而不是internal

2

如果它是在一个单独的项目,你的问题建议,和你的基类被标记内部,那么它不应该能够找到整个类型,更不用说构造。

改变Foo访问公众。

+0

您的意思是访问修饰符?访问者是'get'方法不是吗? – Vort3x 2012-02-23 07:56:14

3

这里有一些混杂的问题。

  • 首先,您的课程在两个单独的项目中定义为内部课程。 internal表示一个类仅在其自己的程序集中可见,而不能在程序集外的客户端代码中可见。美孚应该是公开的,以便它可以在其他组件一起使用
  • 如果你把类Foo可见组装之外,那么你将不得不从包含类酒吧
  • 的项目中引用该程序集,你将不得不作出确保命名空间被正确引用以及