私はジェネリッククラスを持っていますNamedValue<TValue>
:
public class NamedValue<TValue>
{
public string Name { get; set; }
public TValue Value { get; set; }
}
を含む 2 番目のジェネリック クラスNamedValueSource<TValue>
がありますList<NamedValue<TValue>>
。
public class NamedValueSource<TValue>
{
public List<NamedValue<TValue>> NamedValues { get; set; }
public NamedValueSource()
{
NamedValues = GetNamedValues().Cast<NamedValue<TValue>>().ToList();
}
private IEnumerable<NamedValue<bool>> GetNamedValues()
{
var yesNamedValue = new NamedValue<bool> { Name = "Yes", Value = true };
var noNamedValue = new NamedValue<bool> { Name = "Yes", Value = false };
yield return yesNamedValue;
yield return noNamedValue;
}
}
次のテスト コードは完全に機能します (アサーションはパスします)。
public class Tester
{
public Tester()
{
var source = new NamedValueSource<bool>();
Debug.Assert(source.NamedValues[0].Name == "Yes");
}
}
さて、ここが興味深い部分です。内GetNamedValues()
でキャストを実行しようとすると、コードはコンパイルされません。
public class NamedValueSourceFail<TValue>
{
public List<NamedValue<TValue>> NamedValues { get; set; }
public NamedValueSourceFail()
{
NamedValues = GetNamedValues().ToList();
}
private IEnumerable<NamedValue<TValue>> GetNamedValues()
{
var yesNamedValue = new NamedValue<bool> { Name = "Yes", Value = true };
var noNamedValue = new NamedValue<bool> { Name = "Yes", Value = false };
yield return (NamedValue<TValue>)yesNamedValue; // ERROR: cannot convert type
yield return (NamedValue<TValue>)noNamedValue; // ERROR: cannot convert type
}
}
エラーが発生しているNamedValueSource<TValue>
間にコンパイルするのはなぜですか? NamedValueSourceFail<TValue>
具体的には、Linq を使用してキャストを実行できるのに、古き良き括弧を使用できないのはなぜですか?
編集
受け入れられた回答のコメント スレッドから完全に明確でない場合は、object
まず に変換する必要があり、次に にキャストできNamedValue<TValue>
ます。これはおそらく、LinqCast
メソッドが舞台裏でどのように機能するかです。