Warum bin ich immer CS0119 über eine statische Methode in einer Vorlage?
Warum wird in diesem (erfundenen) Beispiel geben, "Fehler CS0119: 'T' a "- Typ-parameter', das gilt nicht in diesem Zusammenhang". Sicherlich habe ich ihm gesagt, dass der Typ eine geeignete Methode?
abstract class Foo
{
static public bool IsIt() {return true;}
}
class Bar
{
public bool CanIt<T>() where T : Foo
{
return T.IsIt();
}
}
Die eigentliche motivierende Beispiel ist etwas komplizierter mit CRTP in der template-parameter, aber das zeigt das problem.
- Sie sind sich nicht übergeben Sie eine Instanz von
T
sind Sie nur auf der Durchreise zu seinem Typ. Sie können nicht rufen Sie eine Methode auf etwas ist es einfach zu bestimmen Art. - Das macht nicht wirklich Sinn. Statische Methoden werden nicht vererbt, so ist Ihre Klasse nie wieder was anderes, aber wahr und darüber hinaus keine Ableitung von Foo ist gezwungen, um einen statischen member aufgerufen, IsIt. Kann es garnicht gibt.
- c# nicht Vorlagen. Es hat Generika.
- fair point, aber Sie wissen, was ich meine.
- du meinst eine Ableitung von Foo verstecken konnte die statische Methode in seiner Basis? Wie?
- Einfach nicht, es Umzusetzen. Ich denke Aufruf der statischen durch eine abgeleitete Klasse funktioniert, aber strahlt eine Warnung. Aber es gibt keine Vererbung. Wenn Sie einschränken, dass T Foo, es würde immer Foo.IsIt, nie eine abgeleitete Klasse " - Methode. Und weil das so ist, es ist nicht möglich, weil Foo.IsIt würde genauso gut funktionieren ohne jemanden zu verkennen Sie für die Arbeit Vererbung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den C# - compiler unterstützt den Aufruf von statischen Methoden aus der Typ-Parameter.
Beachten Sie, dass es keinen Wert dies zu tun hier. Der Aufruf
IsIt
muss abgegeben werden, wennCanIt
kompiliert wird. Es gibt keine Möglichkeit der Berufung auf eine statische Methode in einer virtuellen Versand Weise Eine statische Methode kann nur aufgerufen werden, indem Sie sich auf die Art + Methode direkt. Also das einzige, was der compiler tun könnte, wäre hier zu emittieren, einen Anruf zuFoo::IsIt
. Also warum nicht einfach anrufenFoo::IsIt
direkt?Diese Antwort ist keine news, aber ich denke, Sie haben ein design-Problem hier. Obwohl das nicht die Antwort auf Ihre Frage...warum gehen Sie nicht den OOP-Weg? Warum Generika verwendet werden, wenn natürlich Sie nicht brauchen, Sie hier? Warum nicht machen dieses
CanIt
Methode nur eine schlichte OOP-Methode, und übergeben Sie die abstrakte Klasse als parameter. TutIsIt
haben, um eine statische Methode? Natürlich, es hängt davon ab, was du zu erreichen versuchst, aber ich würde es machen, eine virtuelle Methode, so dass andere außer Kraft setzen kann als gut. Wieder, ich rieche design-FragenIch glaube, es macht es einfacher und leichter zu verstehen. Oder vielleicht bin ich old-fashion...ich weiß nicht,