Ich schreibe eine generische Klasse für Min-Heap, wo ich auf TKey
sowie T
Heap-fähig sein möchte.Kann Lambda-Ausdruck nicht in Delegate-Typ konvertieren 'System.Func <T,TKey>'
interface IHeap<T, TKey>
where TKey : IComparable<TKey>
{
void Insert(T x);
T Delete();
T Top();
}
public class MinHeap<T, TKey> : IHeap<T, TKey>
where TKey : IComparable<TKey>
{
public MinHeap(int capacity)
: this(capacity, x => x) // <---- compilation error here
{ }
public MinHeap(int capacity, Func<T, TKey> keySelector)
: this(capacity, keySelector, Comparer<TKey>.Default)
{ }
public MinHeap(int capacity, Func<T, TKey> keySelector, IComparer<TKey> comparer)
{
// ...
}
// ...
}
ich diese Kompilierungsfehlern für x => x
:
Cannot convert lambda expression to delegate type 'System.Func<T,TKey>' because some of the return types in the block are not implicitly convertible to the delegate return type.
Cannot implicitly convert type 'T' to 'TKey'
Wie erreiche ich dieses und haben nur eine Klasse?
Update:
Ich möchte in der Lage sein, zwei Dinge zu tun:
// 1
var minheap = new MinHeap<Person, int>(10, x => x.Age);
// 2
var minheap = new MinHeap<int>(10);
// instead of
var minheap = new MinHeap<int, int>(10, x => x);
Der Compilerfehler ist klar, warum der Code ungültig ist. Ihre Frage ist _nicht_ klar, warum Sie denken, dass ein solcher Code funktionieren sollte. Der Sinn von Generika besteht darin, die Typsicherheit für die Kompilierung zu gewährleisten, aber angesichts Ihrer aktuellen Deklarationen ist es nicht möglich, die Typensicherheit zum Zeitpunkt der Kompilierung für diesen Ausdruck sicherzustellen. Bitte erkläre dein Denken besser. –
Ich möchte Person [] auf Person.Age, die Eigenschaft einer Person ('TKey'), häufen. Ich würde auch gern auf int [] ('T') häufen. – hIpPy
Etwas tun zu wollen, ist keine Erklärung. Ich möchte, dass mein C# -Compiler mir jedes Mal eine Schokoladenminze aushändigt, wenn ich mein Programm kompiliere, aber es hat keinen Sinn, mich zu fragen, wie ich es dazu bringen kann. Es ist klar, dass das nicht möglich ist. Ebenso bitten Sie den Compiler, etwas zu tun, was schlicht unmöglich ist. Bitte erklären Sie, warum Sie es für möglich halten. Bens Antwort kommt dem am nächsten, was meiner Meinung nach in diesem Zusammenhang nützlich sein könnte, aber ich befürchte, dass es nicht wirklich auf dein Missverständnis eingeht. Das können wir nicht tun, ohne das Missverständnis besser zu verstehen. –