Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么不';词典&燃气轮机;与派生类型兼容的键? TypeA()=类结束 类型TypeB()=继承类型a() //“类型'TypeA'与类型'TypeB'不匹配:” 让iDict:IDictionary=[TypeB(),true;TypeB(),false]|>dict 设d=字典() //不过,这没关系: d、 添加(TypeB(),false)_Dictionary_F#_Covariance_Idictionary - Fatal编程技术网

为什么不';词典&燃气轮机;与派生类型兼容的键? TypeA()=类结束 类型TypeB()=继承类型a() //“类型'TypeA'与类型'TypeB'不匹配:” 让iDict:IDictionary=[TypeB(),true;TypeB(),false]|>dict 设d=字典() //不过,这没关系: d、 添加(TypeB(),false)

为什么不';词典&燃气轮机;与派生类型兼容的键? TypeA()=类结束 类型TypeB()=继承类型a() //“类型'TypeA'与类型'TypeB'不匹配:” 让iDict:IDictionary=[TypeB(),true;TypeB(),false]|>dict 设d=字典() //不过,这没关系: d、 添加(TypeB(),false),dictionary,f#,covariance,idictionary,Dictionary,F#,Covariance,Idictionary,为什么IDictionary键与派生类型不兼容?让我们看看这两种方法之间的区别: 在第一种情况下,您正在创建一个列表: type TypeA () = class end type TypeB () = inherit TypeA () // "The type 'TypeA' does not match the type 'TypeB'": let iDict : IDictionary<TypeA, bool> = [ TypeB (), true; TypeB (), fa

为什么IDictionary键与派生类型不兼容?

让我们看看这两种方法之间的区别:

在第一种情况下,您正在创建一个列表:

type TypeA () = class end
type TypeB () = inherit TypeA ()

// "The type 'TypeA' does not match the type 'TypeB'":
let iDict : IDictionary<TypeA, bool> = [ TypeB (), true; TypeB (), false ] |> dict

let d = Dictionary<TypeA, bool> ()
// This is OK, though:
d.Add (TypeB (), false)
这有类型
(TypeB*bool)列表

函数的类型为
seq->IDictionary(需要相等)

因此,应用
dict
功能

[ TypeB (), true; TypeB (), false ]
结果的值类型为
IDictionary

IDictionary
不等同于
IDictionary
,它们是完全不同且不兼容的类型,因此存在编译器错误

如果您想以这种方式从更多派生类型的集合中初始化词典,则必须显式地进行向上转换,例如:

dict [ TypeB (), true; TypeB (), false ]

在第二个示例中,这个问题从未出现,因为您最初创建了一个
字典


然后使用
Add
方法将
TypeB
添加到字典中。由于
Add
是一种方法,因此F#可以对参数执行自动向上转换,以便
TypeB
的值自动向上转换为
TypeA

绑定为重复,但是F#中的数组不是协变的-像add这样的方法重载被认为是因为
KeyValuePair
'Key
上是不协变的。注意:列表是按逆时间顺序排列的,所以从末尾开始向前看。感兴趣的是:
let iDict = 
    [ TypeB (), true; TypeB (), false ] 
    |> List.map (fun (a,b) -> (a :> TypeA), b) 
    |> dict