为什么C#编译器允许使用Linq执行强制转换但不允许使用括号?

为什么C#编译器允许使用Linq执行强制转换但不允许使用括号?,第1张

概述我有一个通用类NamedValue< TValue>: public class NamedValue<TValue>{ public string Name { get; set; } public TValue Value { get; set; }} 我有第二个通用类,NamedValueSource< TValue>包含List< NamedValue< TValue> 我有一个通用类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 = 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执行强制转换但不允许使用括号?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1225131.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存