【发布时间】:2011-12-27 18:02:13
【问题描述】:
下面的代码完全一样,只是一个是C#,另一个是VB.Net。 C# 编译得很好,但 VB.Net 抛出警告:
Interface 'System.IObserver(Of Foo)' 与另一个不明确 由于 'In' 和 'Interface IObserver(Of In T)'中的'Out'参数
为什么 VB.Net 显示警告而不是 C#?最重要的是,我该如何解决这个问题?
Obs:我正在使用 .Net Framework 4 和 Visual Studio 2010 Ultimate。
VB.Net 代码:
Module Module1
Sub Main()
End Sub
Public Class Foo
End Class
Public Class Bar
End Class
Public Class Beholder
Implements IObserver(Of Foo)
Implements IObserver(Of Bar)
#Region "Impl"
Public Sub OnCompleted() Implements System.IObserver(Of Bar).OnCompleted
End Sub
Public Sub OnError([error] As System.Exception) Implements System.IObserver(Of Bar).OnError
End Sub
Public Sub OnNext(value As Bar) Implements System.IObserver(Of Bar).OnNext
End Sub
Public Sub OnCompleted1() Implements System.IObserver(Of Foo).OnCompleted
End Sub
Public Sub OnError1([error] As System.Exception) Implements System.IObserver(Of Foo).OnError
End Sub
Public Sub OnNext1(value As Foo) Implements System.IObserver(Of Foo).OnNext
End Sub
#End Region
End Class
End Module
C#代码:
class Program {
static void Main(string[] args) {
}
}
public class Foo { }
public class Bar { }
public class Beholder : IObserver<Foo>, IObserver<Bar> {
#region IObserver<Foo> Members
public void OnCompleted() {
throw new NotImplementedException();
}
public void OnError(Exception error) {
throw new NotImplementedException();
}
public void OnNext(Foo value) {
throw new NotImplementedException();
}
#endregion
#region IObserver<Bar> Members
public void OnNext(Bar value) {
throw new NotImplementedException();
}
#endregion
}
【问题讨论】:
-
“为什么?”你的问题模棱两可。你在问为什么VB会发出这个警告?或者为什么 C# 不给出这个警告?还是什么?
-
两者都实现的设计很糟糕。有两个不同的子对象订阅两个观察者。
-
嗯,VB.net 警告有点奇怪。接口是逆变的,
Foo/Bar是独立的类。我想不出任何T的IObserver<T>同时是IObserver<Foo>和IObserver<Bar>。 -
埃里克,我已经编辑了这个问题。 CodeInChaos,起初我在考虑 Object 类型,但同样的问题发生在 IEnumerable
接口上,它是 Covariant... -
@CodeInChaos 是对的; VB 警告似乎是一个错误。虽然这不一定是一个好的编程实践,但接口不可能统一。如果接口被标记为“out”而不是“in”,那么它们可以统一,从而产生实现定义的行为。
标签: c# .net vb.net generics generic-variance