gpt4 book ai didi

c# - 对于从 IEnumerable 继承的 .Net 类,为什么 GetEnumerator 在 COM 中不可见?

转载 作者:行者123 更新时间:2023-11-30 17:56:59 25 4
gpt4 key购买 nike

我目前正在尝试使 C# API 在 COM 中可见,并且我目前坚持制作非通用 GetEnumerator对于同样继承 IEnumerable<T> 的类,在 COM 中可见的方法.如果我在 ITestIEnumerable 上实现另一种方法,可见。我还发现非通用 GetEnumerator方法在派生自列表的类上可见。

我真的不明白为什么这不起作用,这似乎是继承 IEnumerable<T> 的类的特例。 .无论如何要将其公开给 COM,以便我可以在 VB6 中使用 For Each 构造?

例如

[ClassInterface(ClassInterfaceType.AutoDual)]
[ProgId("Test")]
[Guid("1aa2bdec-0530-44e8-b62d-b75914a6de22")]
public class TestIEnumerable : ITestIEnumerable
{
#region IEnumerable<Item> Members

[ComVisible(false)]
public IEnumerator<Item> GetEnumerator()
{
return _collection.GetEnumerator();
}

#endregion

#region ITestIEnumerable Members

[DispId(-4)]
[ComVisible(true)]
IEnumerator ITestIEnumerable.GetEnumerator()
{
return _collection.GetEnumerator();
}

#endregion

#region IEnumerable Members

[DispId(-4)]
[ComVisible(true)]
IEnumerator IEnumerable.GetEnumerator()
{
return _collection.GetEnumerator();
}

#endregion
}

[InterfaceType(ComInterfaceType.InterfaceIsDual)]
[Guid("187f3fed-9d4a-4a52-9a7c-a2fdeb56b9fa")]
[ComImport]
public interface ITestIEnumerable : IEnumerable<Item>
{
[DispId(-4)]
[ComVisible(true)]
new IEnumerator GetEnumerator();
}

最佳答案

您不能拥有多个具有相同签名的同名公共(public)方法。因此,您的两个 GetEnumerator 方法正在使用显式接口(interface)实现来实现:

IEnumerator ITestIEnumerable.GetEnumerator()
{
}

因此,它们被视为私有(private)成员 - 它甚至对其他 .NET 代码不可见,除非该代码将您的 TestIEnumerable 对象转换为 ITestIEnumerable

因此,决定您希望公开哪个 GetEnumerator() 方法,并将其公开:

public IEnumerator GetEnumerator()
{
}

并将通用的切换为显式实现:

IEnumerator<Item> IEnumerable<Item>.GetEnumerator()
{
}

关于c# - 对于从 IEnumerable<T> 继承的 .Net 类,为什么 GetEnumerator 在 COM 中不可见?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13604349/

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