.net 静态转换工作时,动态转换出错
将.net 静态转换工作时,动态转换出错,.net,casting,f#,.net,Casting,F#,将System.Collections.Generic.List转换为int-seq。我认为这在静态和动态情况下都应该很容易工作,我认为任何在静态情况下工作的东西都应该在动态情况下工作,但我得到的结果如下: 静态: > List<int>() :> int seq;; val it : seq<int> = seq [] >List():>int-seq;; val it:seq=seq[] 动态: > List<int>() :?>
System.Collections.Generic.List
转换为int-seq
。我认为这在静态和动态情况下都应该很容易工作,我认为任何在静态情况下工作的东西都应该在动态情况下工作,但我得到的结果如下:
静态:
> List<int>() :> int seq;;
val it : seq<int> = seq []
>List():>int-seq;;
val it:seq=seq[]
动态:
> List<int>() :?> int seq;;
List<int>() :?> int seq;;
^^^^^^^^^^^^^^^^^^^^^^^
stdin(115,1): warning FS0067: This type test or downcast will always hold
List<int>() :?> int seq;;
^^^^^^^^^^^^^^^^^^^^^^^
stdin(115,1): error FS0193: Type constraint mismatch. The type
seq<int>
is not compatible with type
List<int>
The type 'seq<int>' is not compatible with the type 'List<int>'
>List():?>int-seq;;
List():?>int-seq;;
^^^^^^^^^^^^^^^^^^^^^^^
标准DIN(115,1):警告FS0067:此型式试验或向下浇铸将始终有效
List():?>int-seq;;
^^^^^^^^^^^^^^^^^^^^^^^
stdin(115,1):错误FS0193:类型约束不匹配。类型
序号
与类型不兼容
列表
类型“seq”与类型“List”不兼容
这是怎么回事?问题在于方向 使用
:>
您可以“走向”obj-一个始终会成功的演员阵容
使用:?>
朝相反的方向走,演员可能会失败
因此,您不能在示例中使用:?>
,因为您走错了方向
我认为将它们视为静态和动态类型是错误的。使用上向和下向使区别更加明显。这是F#语言中的一个已知问题。它当前阻止从对象以外的任何对象对接口进行动态强制转换。唐在这里评论说,这一限制将在未来的版本中删除
哇,从2007年开始营业。。。我想从那时起,我甚至没有打开过浏览器标签。我想这并不能回答这个问题。显然,您提到的问题已经解决了,因为类似于
[1]:>seq
的东西可以工作。问题是,正如John在回答中所说的,他试图降级为超类型。@daniel此错误是特定于接口的。基本类型与否无关紧要我不会假设“修复”这个问题仍然是计划中的-当前的行为明确地体现在规范中,基本的逻辑似乎是,降级应该是向下的,正如约翰·帕尔默所建议的那样。@JaredPar-seq
是一个界面——特别是它正是IEnumerableI认为动态的
/静态的
是对向上的
/向下的
的补充,前者是暂时的(当转换发生时),后者是定向的(在面向对象的层次结构意义上).@Daniel-规范定义了向上播放
和向下播放
,:?>
@kvb:和向上播放
/向下播放
的含义。但是,其他语言中类似的运算符通常被称为静态
/动态
的原因也与F#有关。规范的语言可能更有用,但我认为说静态的/动态的是错误的是言过其实。@Daniel-我同意这不是“错误的”-只是它可能没有帮助。如果您将:?>
视为一个动态强制转换,那么在这种情况下编译器的行为是很难理解的,但是如果您将其视为一个向下转换,那么编译器不允许对超类型进行“向下转换”这一事实似乎并不奇怪。