.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-我同意这不是“错误的”-只是它可能没有帮助。如果您将
:?>
视为一个动态强制转换,那么在这种情况下编译器的行为是很难理解的,但是如果您将其视为一个向下转换,那么编译器不允许对超类型进行“向下转换”这一事实似乎并不奇怪。