Sub New()在此上下文中无法访问,因为它是'Friend'

时间:2009-07-22 19:47:36

标签: vb.net

那么这是什么意思,我该如何解决?

如果我将New关键字放在下面的行中,则会出现此消息。如果我删除它,我在运行时收到错误,说我需要使用New。我做错了什么?

Dim oPS As AeccPointStyle = New AeccPointStyle
ops = oDescKey.PointStyle 

Debug.Print(oPS.Name)
Debug.Print(oPS.MarkerSymbolName)

也试过

Dim oPS As New AeccPointStyle
ops = oDescKey.PointStyle

Debug.Print(oPS.Name)
Debug.Print(oPS.MarkerSymbolName)

谢谢!

更新1 - 基于Meta-Knight的评论

1 -

Dim oPS As AeccPointStyle = Nothing
oPS = oDescKey.PointStyle

2 -

Dim oPS As AeccPointStyle = oDescKey.PointStyle

两个版本都会抛出NullReferenceExceptions。

6 个答案:

答案 0 :(得分:4)

AeccPointStyle的空构造函数被标记为friend,这意味着只有其程序集中的类可以调用它。

但是看看你的代码,我认为你不需要打电话给New。一开始就把它设置为Nothing。或者甚至更好,直接设置您的变量具有良好的值:

Dim oPS As AeccPointStyle = oDescKey.PointStyle

编辑您的NullReferenceException:

通常,在调用值为Nothing的对象的属性时会引发此类异常。在这种情况下,如果oDescKey设置为Nothing,则会引发此类异常。

如果oDescKey没有Nothing值,那么执行某些代码的唯一事情就是PointStyle属性。因此可以安全地假设PointStyle属性抛出NullReferenceException。尝试在调试器中观察oDescKey.PointStyle变量,您应该看到它抛出异常。

答案 1 :(得分:2)

如果你的AeccPointStyle类使用'朋友'修饰符, 即它被定义为:

Friend Class AeccPointStyle

或默认构造函数具有'Friend'修饰符, 即:

Friend Sub New()

并且您发布的代码不在同一个程序集中,您无法在此类上调用构造函数。为了使其工作,您必须将代码放在与AeccPointStyle类相同的程序集中。查看此页面以了解有关修饰符的更多信息:more information about modifiers

答案 2 :(得分:0)

我的猜测如下:AeccPointStyle在另一个程序集中声明,而不是问题中的代码示例。 Sub New的构造函数(AeccPointStyle)被声明为Friend,这意味着它只能在同一个程序集中访问。

您可以通过两种方式解决此问题

  • 更改Sub New,使其为Public
  • 提供Shared Public Sub Create,将创建并返回新的AeccPointStyle

答案 3 :(得分:0)

AeccPointStyle没有公共默认构造函数。您尝试使用的那个仅限于同一程序集中的其他类。

以下是我在网上找到的一些代码:

Dim oPointStyle As AeccPointStyle 
Set oPointStyle = g_oAeccDoc.PointStyles.Add(strName) 

请注意,g_oAeccDoc上的PointStyles属性(可能是某种PointStylesColleciton)正在实例化并为您返回一个新的AeccPointStyle实例。

答案 4 :(得分:0)

当您使用FRIEND作为您的类的访问修饰符时,您需要确保它自己的类和您使用它的类在同一个NAMESPACE中,否则您将收到此错误消息。

答案 5 :(得分:0)

对于遇到此问题的其他人,我必须对我们引用的旧项目进行单向升级。当它是 2.0/3.5 时,它也将其升级到 .NET 4.0。这导致旧版本的(也是旧的)项目在引用它时出现此错误。将新升级的版本改回 .NET 3.5 对我来说很有效。这是一个非常难以描述的错误!