我有一个通用类NamedValue<TValue>
:
public class NamedValue<TValue>
{
public string Name { get; set; }
public TValue Value { get; set; }
}
我有第二个泛型类,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 进行演员阵容,但不能使用好的 ol' parantheses?
编辑
如果从已接受答案的评论线程中不完全清楚,我只需object
要先转换为,然后我将被允许转换为NamedValue<TValue>
. 这可能是 LinqCast
方法在幕后工作的方式。