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 = 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?
编辑
如果从接受的答案的评论主题中不完全清楚,我只需要先转换为对象,然后我将被允许转换为namedValue< TValue>.这可能是linq Cast方法在幕后工作的方式.
解决方法 在第二个示例中,您尝试转换namedValue< bool>到namedValue< TValue> – 这不起作用,因为转换必须对任何类型参数有效.你无法转换namedValue< bool>到namedValue< int>或namedValue< string>或namedValue< AnythingElSEOtherThanBool>.一种解决方案是使namedValueSource< TValue> abstract,以及它的GetnamedValues()方法,然后创建一个类BooleannamedValueSource:namedValueSource< bool>在测试中使用的类.
在linq的情况下,编译器没有完成转换;强制转换发生在已经编译的方法中.所有编译器都知道它正在调用一个采用IEnumerable< bool>的方法.并返回IEnumerable< TValue>.转换的细节对编译器完全不可见.
总结以上是内存溢出为你收集整理的为什么C#编译器允许使用Linq执行强制转换但不允许使用括号?全部内容,希望文章能够帮你解决为什么C#编译器允许使用Linq执行强制转换但不允许使用括号?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)