以下のジェネリックメソッドがコンパイルされない理由を知りたいです(C#4.0)。私の同僚も私もそれを理解することはできません。
this
コンパイラは、これをから派生するように制約SelectableRowBase
されているaに変換できないと文句を言います。明示的なキャストを配置すると、すべてが機能します(そして、それがソース管理でチェックしたものです)が、コンパイラがここで不平を言っている理由を知りたいです。TItem
SelectableRowBase
それはコンパイラエラーですか?私は何かが足りないのですか?
public class SelectableRowBase
{
public void AddToSelectedListWhenIsSelectedChanges<TItem>
(ObservableCollection<TItem> selectedList)
where TItem : SelectableRowBase
{
// Causes error:
// The best overloaded method match for
// 'System.Collections.ObjectModel.Collection<TItem>.Add(TItem)'
// has some invalid arguments
// Argument 1: cannot convert from SelectableRowBase' to 'TItem'
Action actionOnSelected = () => selectedList.Add(this);
Action actionOnDeselected = () => selectedList.Remove(this);
// Compiles and works fine
// only difference is the explicit cast
Action actionOnSelected = () => selectedList.Add((TItem)this);
Action actionOnDeselected = () => selectedList.Remove((TItem)this);
}
}