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

Mik*_*nen 8 .net vb.net constructor interop reference

为什么构造函数ORDER在VB.Net中很重要?我正在构建一个.Net类型库,它旨在完全包装底层的COM库,以便API的使用者可以假装使用带有.Net集合的漂亮.Net库而不是COM库.

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

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

以下作品:

public class ObjectID
{
    public ObjectID(int type, int id)
    {
        this.Type = type;
        this.ID = id;
    }

    internal ObjectID(COMLib.ObjectID id) : this(id.Type, id.ID) { }

    public int ID { get; set; }
    public int Type { get; set; }

    internal COMLib.ObjectID ToCOM()
    {
        COMLib.ObjectID id = new COMLib.ObjectID();
        id.ID = this.ID;
        id.Type = this.Type;
        return id;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

public class ObjectID
{
    internal ObjectID(COMLib.ObjectID id) : this(id.Type, id.ID) { }

    public ObjectID(int type, int id)
    {
        this.Type = type;
        this.ID = id;
    }

    public int ID { get; set; }
    public int Type { get; set; }

    internal COMLib.ObjectID ToCOM()
    {
        COMLib.ObjectID id = new COMLib.ObjectID();
        id.ID = this.ID;
        id.Type = this.Type;
        return id;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

更新

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

C#类库:包装

namespace Wrapped
{
    public class Class1
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

C#类库:包装器

namespace Wrapper
{
    public class Class1
    {
        internal Class1(Wrapped.Class1 c) { }
        public Class1() { }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Module Module1
    Sub Main()
        Dim w As New Wrapper.Class1
    End Sub
End Module
Run Code Online (Sandbox Code Playgroud)

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

Dim w As New Wrapper.Class1
Run Code Online (Sandbox Code Playgroud)

产生错误

Reference required to assembly 'Wrapped, Version=1.0.0.0,
                                         Culture=neutral,
                                         PublicKeyToken=null'
containing the type 'Wrapped.Class1'.
Add one to your project.
Run Code Online (Sandbox Code Playgroud)

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

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

在玩了一些之后更新

Causes error:          No error:

     Vb-ReferTest          Vb-RefererTest
          |                      |                     Fixes error in Vb-
          V                      V                      RefererTest even
      Cs-Wrapper            Cs-Wrapper   Vb-Wrapper <-  if the Vb-Wrapper
          |                       \         /          and the RefererTest
          V                        V       V             have no direct
   Cs-WrappedLibrary           Cs-WrappedLibrary          relationship
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 1

如果正确(我无法轻易验证),那真是令人着迷。AFAIK,顺序应该不重要。如果您确定这一点,那么也许可以将其记录为连接错误(使用示例代码)。