是否可以转换List至List在C#4.0中?大致是这样的:classjoe:human{}Listjoes=GetJoes();ListhumanJoes=joes;这不就是协方差的作用吗?如果你能做到:humanh=joe1ashuman;为什么你不能做Listhumans=joesasList;做(joe)humans[0]是不合法的,因为那个项目已经被贬低了..每个人都会很高兴。现在唯一的选择是创建一个新的列表 最佳答案 你不能这样做,因为它不安全。考虑:Listjoes=GetJoes();ListhumanJoes=jo
我正在尝试公开一个只读字典,该字典包含具有只读接口(interface)的对象。在内部,字典是可写的,其中的对象也是可写的(见下面的示例代码)。我的问题是IReadOnlyDictionary不支持协变转换,原因在问题here中列出。.这意味着我不能只将我的内部字典公开为只读字典。所以我的问题是,是否有一种有效的方法可以将我的内部字典转换为IReadOnlyDictionary,或者其他一些方法来处理这个问题?我能想到的选项是:持有两个内部词典并保持同步。在访问该属性时创建一个新字典并转换其中的所有对象。在内部使用时将IReadOnly转换回NotReadOnly。1看起来很痛苦,2看
我正在尝试公开一个只读字典,该字典包含具有只读接口(interface)的对象。在内部,字典是可写的,其中的对象也是可写的(见下面的示例代码)。我的问题是IReadOnlyDictionary不支持协变转换,原因在问题here中列出。.这意味着我不能只将我的内部字典公开为只读字典。所以我的问题是,是否有一种有效的方法可以将我的内部字典转换为IReadOnlyDictionary,或者其他一些方法来处理这个问题?我能想到的选项是:持有两个内部词典并保持同步。在访问该属性时创建一个新字典并转换其中的所有对象。在内部使用时将IReadOnly转换回NotReadOnly。1看起来很痛苦,2看
我有一个对象列表,属于我的类型QuoteHeader我想将此列表作为对象列表传递给能够接受List的方法.我的代码行是...Tools.MyMethod((List)MyListOfQuoteHeaders);但我在设计时遇到以下错误...Cannotconverttype'System.Collections.Generic.List'to'System.Collections.Generic.List'我需要对我的类(class)做些什么才能允许这样做吗?我认为所有类都继承自对象,所以我不明白为什么这行不通? 最佳答案 这不合法
我有一个对象列表,属于我的类型QuoteHeader我想将此列表作为对象列表传递给能够接受List的方法.我的代码行是...Tools.MyMethod((List)MyListOfQuoteHeaders);但我在设计时遇到以下错误...Cannotconverttype'System.Collections.Generic.List'to'System.Collections.Generic.List'我需要对我的类(class)做些什么才能允许这样做吗?我认为所有类都继承自对象,所以我不明白为什么这行不通? 最佳答案 这不合法
这是怎么回事?interfaceIRepositorywhereT:IBusinessEntity{IQueryableGetAll();voidSave(Tt);voidDelete(Tt);}它说:Invalidvariance:Thetypeparameter'T'mustbecontravariantlyvalidon'MyNamespace.IRepository.Delete(T)'.'T'iscovariant. 最佳答案 考虑如果编译器允许会发生什么:interfaceIR{voidD(Tt);}classC:IR{
这是怎么回事?interfaceIRepositorywhereT:IBusinessEntity{IQueryableGetAll();voidSave(Tt);voidDelete(Tt);}它说:Invalidvariance:Thetypeparameter'T'mustbecontravariantlyvalidon'MyNamespace.IRepository.Delete(T)'.'T'iscovariant. 最佳答案 考虑如果编译器允许会发生什么:interfaceIR{voidD(Tt);}classC:IR{
在C#中可以为类型参数添加方差注释,限制为值类型:interfaceIFoowhereT:struct{voidBoo(Tx);}如果方差注释在这种情况下完全没有意义,为什么编译器允许这样做? 最佳答案 Whythisisallowedbycompilersincevarianceannotationmakecompletelynosenseinasuchsituation?这是编译器允许的,因为当我向C#4.0编译器添加差异规则时,我什至从未考虑过有人可能会尝试这样做。编译器警告和错误是特性,为了实现某个特性,至少必须在发布编译器
在C#中可以为类型参数添加方差注释,限制为值类型:interfaceIFoowhereT:struct{voidBoo(Tx);}如果方差注释在这种情况下完全没有意义,为什么编译器允许这样做? 最佳答案 Whythisisallowedbycompilersincevarianceannotationmakecompletelynosenseinasuchsituation?这是编译器允许的,因为当我向C#4.0编译器添加差异规则时,我什至从未考虑过有人可能会尝试这样做。编译器警告和错误是特性,为了实现某个特性,至少必须在发布编译器
我试图从网上的几篇文章和StackOverflow上的问题中找出Covariance和Contravariance这两个词的确切含义,据我所知,这只是多态性的另一种说法。我上面的说法正确吗?还是我听错了? 最佳答案 肯定和多态有关。不过,我不会说它们只是多态性的“另一个词”——它们是关于非常具体的情况,在这种情况下,您可以将一种类型视为另一种类型在特定上下文中。例如,使用正常的多态性,您可以处理对Banana的任何引用作为对Fruit的引用-但这并不意味着您可以替代Fruit每次当您看到Banana类型时.例如,List不能被视为L