gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 08:50:36 25 4
gpt4 key购买 nike

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

目前我的大多数类只是使用反射和 CodeDOM 构建的 1 对 1 包装器。这些类有一个内部构造函数,它将底层的 COM 类型作为参数。 CodeDOM 将 this 构建为该类的第一个构造函数。在 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;
}
}

以下需要对 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;
}
}

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

更新

这听起来太疯狂了,以至于我自己开始怀疑。设法用 3 个项目复制它。

C# 类库:已包装
namespace Wrapped
{
public class Class1
{
}
}

C# 类库:包装器
namespace Wrapper
{
public class Class1
{
internal Class1(Wrapped.Class1 c) { }
public Class1() { }
}
}

VB.Net 控制台应用程序:Referer
Module Module1
Sub Main()
Dim w As New Wrapper.Class1
End Sub
End Module

Wrapper 指 Wrapped
Referer 指 Wrapper
引用者不引用 Wrapped
Dim w As New Wrapper.Class1

产生错误
Reference required to assembly 'Wrapped, Version=1.0.0.0,
Culture=neutral,
PublicKeyToken=null'
containing the type 'Wrapped.Class1'.
Add one to your project.

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

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

最佳答案

如果正确(我无法轻易验证),那真是令人着迷。顺序不重要,AFAIK。如果你确定,那么也许 log as a bug on connect (带有示例代码)。

关于.net - VB.Net 构造函数顺序很重要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/826905/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com