VB.NET与C#的交叉兼容性

4
我有一个带有通用接口的C#项目。
public interface IMyFoo<T> { void DoSomething(T instance); }

我还有一个C#项目,其中的接口继承自多个IMyFoos

public interface IMyBar : IMyFoo<Type1>, IMyFoo<Type2> { ... }

在C#领域中一切都很好(包括下面的场景,但在VB中无法正常工作)。

我有一个VB .NET项目,引用了这个C#库。

我有一个IMyBar实例,并尝试按以下方式使用:

Dim instance as MyType1 = ...
Dim bar as IMyBar = ...
bar.DoSomething(instance) ' This generates a compile error: 
' 'DoSomething' is ambiguous across the inherited interfaces 'IMyFoo(Of MyType1)' and 'IMyFoo(Of MyType2)'. 

最近怎么样?我可以像这样进行DirectCast,它能正常工作...但我真的不想这样做。

DirectCast(bar, IMyFoo(Of MyType1)).DoSomething(instance)

MyType1Type1 以及 Type2 之间的关系有些不明显。 - Dan Abramov
gaearon:MyType1和MyType2只是在C#项目中定义的不相关的具体类。 - Jeff
2个回答

6

您可能需要进行强制转换

与其他类型不同,接口可以从多个基接口派生而来。因此,接口可以从不同的基接口继承具有相同名称的类型成员。在这种情况下,派生接口中不可用具有重复名称的成员,并且通过派生接口引用任何这些类型成员都会导致编译时错误,无论签名或重载如何。相反,冲突的类型成员必须通过基接口名称引用。


感谢提供参考。微软这种做法真的很糟糕,我希望这不是微软半成品实现的又一个无法解决的遗留问题。你引用的文章是2003年的...在7年的时间里,我希望他们已经解决了这个问题? - Jeff
我认为你不会很快看到这个问题得到解决。这是2010版本的链接:http://msdn.microsoft.com/en-us/library/x1wz55xc.aspx - Chris Haas
1
克里斯是正确的,它并没有固定,我相信这一切最初都是通过办公室互操作性问题暴露出来的。 - Ta01
@Microsoft:如果有人在看这个:说实话,如果我整天都生产这种半成品的解决方案,我会感到羞耻。 - Jeff

1
仅为了进一步详细说明,VB不直接支持您正在进行的操作的原因是因为您展示的只是一个类实现了具有相同方法的两个接口的特殊情况。每当VB看到这种情况时,它都会强制进行类型转换,以使其明确您打算使用哪一个。VB设计者决定这将使代码更少出错。C#更进一步,假设您知道自己在做什么,并允许您进行调用。您可以使用具有相同方法的两个接口的更通用案例来使C#获得相同的基本错误:
public interface IMyFoo1 { void DoSomething(string instance); }
public interface IMyFoo2 { void DoSomething(string instance); }
public interface IMyBar : IMyFoo1, IMyFoo2 { }
public class MyTestClass : IMyBar
{
    //Explicit interface declaration required
    void IMyFoo1.DoSomething(string instance) { }
    void IMyFoo2.DoSomething(string instance) { }
}

string s = "";
IMyBar bar = new MyTestClass();
bar.DoSomething(s);//The call is ambiguous between the following methods or properties...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接