den folgenden Code vor:Wie ein generisches an die Schnittstelle werfen es implementiert, wenn die Parameter des Typs auf beide eine gemeinsame Schnittstelle in C# implementieren
public class Thing : IThing { }
public interface IThing {}
public interface IContainer<out T> where T : IThing { }
// This works
// public class Container<T> : IContainer<T> where T : IThing { }
// This doesn't work
public class Container<T> : IContainer<IThing> where T : IThing {}
internal class Program
{
private static void Main(string[] args)
{
var concreteContainer = new Container<Thing>();
var abstractContainer = (IContainer<Thing>) concreteContainer;
}
}
Auf dieser Linie:
var abstractContainer = (IContainer<Thing>) concreteContainer;
Sie erhalten der folgende Laufzeitfehler: InvalidCastException: Unable to cast object of type 'CastTest.Container`1[CastTest.Thing]' to type CastTest.IContainer`1[CastTest.Thing]'.
Auch wenn Sie Resharper haben, klagt es mit, Suspecious cast: there is no type in the solution which is inherited from both 'Container<Thing>' and 'IContainer<Thing>'
.
Warum muss es einen Typ geben, der von beiden erbt? Nicht Container<T>
implementieren IContainer<IThing>
? Da Thing
implementiert IThing
, und T
in Container<T>
ist garantiert, IThing
zu implementieren, scheint es, wie ich in der Lage sein sollte, diese Besetzung zu tun.
'Container' implementiert 'IContainer ' nicht 'IContainer '. –
Lee
@hvd Was, jetzt willst du, dass ich tatsächlich aufpasse ?! Mensch, Leute fragen viel. Hoppla! –