VB.Net构造函数顺序很重要?

前端之家收集整理的这篇文章主要介绍了VB.Net构造函数顺序很重要?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
为什么构造函数ORDER在VB.Net中很重要?我正在构建一个.Net类型库,它旨在完全包装底层的COM库,以便API的使用者可以假装使用带有.Net集合的漂亮的.Net库而不是COM库.

目前我的大多数类只是使用Reflection和CodeDOM构建的1到1个包装器.这些类有一个内部构造函数,它将底层的COM类型作为参数. CodeDOM将其构建为该类的第一个构造函数.使用C#中的这些类证明没问题.我需要的只是对.Net库的引用,一切都很好.

当我尝试从VB.Net项目中使用这些类时出现问题.如果第一个构造函数具有COM类型作为参数,则VB.Net项目需要COM互操作程序集作为参考.如果第一个构造函数没有参数或只有托管类型,则一切正常.我的类库是用C#编写的.

以下作品:

  1. public class ObjectID
  2. {
  3. public ObjectID(int type,int id)
  4. {
  5. this.Type = type;
  6. this.ID = id;
  7. }
  8.  
  9. internal ObjectID(COMLib.ObjectID id) : this(id.Type,id.ID) { }
  10.  
  11. public int ID { get; set; }
  12. public int Type { get; set; }
  13.  
  14. internal COMLib.ObjectID ToCOM()
  15. {
  16. COMLib.ObjectID id = new COMLib.ObjectID();
  17. id.ID = this.ID;
  18. id.Type = this.Type;
  19. return id;
  20. }
  21. }

以下需要对COMLib.Interop程序集的引用:

  1. public class ObjectID
  2. {
  3. internal ObjectID(COMLib.ObjectID id) : this(id.Type,id.ID) { }
  4.  
  5. public ObjectID(int type,int id)
  6. {
  7. this.Type = type;
  8. this.ID = id;
  9. }
  10.  
  11. public int ID { get; set; }
  12. public int Type { get; set; }
  13.  
  14. internal COMLib.ObjectID ToCOM()
  15. {
  16. COMLib.ObjectID id = new COMLib.ObjectID();
  17. id.ID = this.ID;
  18. id.Type = this.Type;
  19. return id;
  20. }
  21. }

现在我可以通过为这些类创建一个虚拟私有构造函数作为第一个构造函数解决这个问题,但我对这是什么原因更加好奇?为什么构造函数声明的顺序在VB.Net中很重要?

更新

这听起来很疯狂,我开始怀疑自己.管理用3个项目复制它.

C#类库:Wrapped

  1. namespace Wrapped
  2. {
  3. public class Class1
  4. {
  5. }
  6. }

C#类库:包装器

  1. namespace Wrapper
  2. {
  3. public class Class1
  4. {
  5. internal Class1(Wrapped.Class1 c) { }
  6. public Class1() { }
  7. }
  8. }

VB.Net控制台应用程序:Referer

  1. Module Module1
  2. Sub Main()
  3. Dim w As New Wrapper.Class1
  4. End Sub
  5. End Module

包装是指包装
Referer指的是Wrapper
Referer不引用Wrapped

  1. Dim w As New Wrapper.Class1

产生错误

  1. Reference required to assembly 'Wrapped,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null'
  2. containing the type 'Wrapped.Class1'.
  3. Add one to your project.

交换构造函数的顺序可以解决错误.

https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=442224

在玩了一些之后更新

  1. Causes error: No error:
  2.  
  3. Vb-ReferTest Vb-RefererTest
  4. | | Fixes error in Vb-
  5. V V RefererTest even
  6. Cs-Wrapper Cs-Wrapper Vb-Wrapper <- if the Vb-Wrapper
  7. | \ / and the RefererTest
  8. V V V have no direct
  9. Cs-WrappedLibrary Cs-WrappedLibrary relationship
如果正确(我不能轻易验证),那就是迷人.订单无关紧要,AFAIK.如果你确定,那么可能是 log as a bug on connect(带有示例代码).

猜你在找的VB相关文章