Pass Func<T>, um die Func - <object>
Ich versuche, herauszufinden, wie pass Func<T>
zu Func<object>
public void Foo<T>(Func<T> p) where T:class
{
Foo(p);
}
public void Foo(Func<object> p)
{
}
Seltsame Sache, es funktioniert NET 4.0-Klassenbibliothek, aber nicht in Silverlight 4-Klassenbibliothek.
Eigentlich will ich es in Silverlight, und ich habe input-Parameter wie Func<T, bool>
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wird dies den trick tun:
Func<T, bool>
, da die T-es ist ein input-argument und wir müssen ein down-cast wie diesem:Func<object, bool> f = value => p((T)value);
. Beachten Sie, dass dies möglicherweise nicht korrekt, da es wahrscheinlich dieFoo
Methode, die die input-argument und könnte es scheitern, denn es könnte die Bereitstellung einesobject
können nicht gewirkt werden, um unsereT
.In C# 4.0-targeting .NET 4.0 (d.h. mit Varianz) das ist in Ordnung "wie Sie ist", da es eine Referenz-Erhaltung der Umwandlung von
T : class
zuobject
. Dies ist möglich, weilFunc<T>
ist eigentlich definiert alsFunc<out T>
, so dass es covariant.In früheren Versionen von C#, oder C# 4.0-targeting früheren Versionen .NET, die Sie benötigen, zu übersetzen als pro Steven ' s Antwort.
beachten Sie, Sie müssen Begriffsklärung zu verhindern rekursive! Am einfachsten, zwei Methodennamen. Oder alternativ
Foo((Func<object>)p)
.public delegate TResult Func<TResult>()
, so ist es nicht kovariante