The codes below are exactly the same, except that one is C# and the other one is VB.Net. C# compiles just fine, but VB.Net throws the warning:
Interface 'System.IObserver(Of Foo)' is ambiguous with another implemented interface 'System.IObserver(Of Bar)' due to the 'In' and 'Out' parameters in 'Interface IObserver(Of In T)'
Why does VB.Net show the warning and not C#? And most important, how can I resolve this problem?
Obs: I'm using .Net Framework 4 with Visual Studio 2010 Ultimate.
VB.Net Code:
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# Code:
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
}
Summing up:
IEnumerable<T>
then the warning would be justified. If you have an object that is both a sequence of Turtles and a sequence of Giraffes, then what happens when you implicitly convert it to sequence of Animal? Do you get Turtles or Giraffes? The runtime just picks one, which is not necessarily the behaviour you want.For some interesting discussion of the last point see the comments to my 2007 article on the subject: