下面的代码是实现协变返回types的唯一方法吗? public abstract class BaseApplication<T> { public T Employee{ get; set; } } public class Application : BaseApplication<ExistingEmployee> {} public class NewApplication : BaseApplication<NewEmployee> {} 我希望能够构build一个应用程序或一个新的应用程序,并从Employee属性返回相应的Employeetypes。 var app = new Application(); var employee = app.Employee; // this should be of type ExistingEmployee 我相信这个代码工作正常,但是当我有几个属性需要相同的行为时,它变得非常讨厌。 有没有其他方法来实现这种行为? generics或其他?
请在Java中展示协变和逆变的一个好例子。
编辑 :根据原来的答案重新写这个问题 scala.collection.immutable.Set类在其types参数中不是协变的。 为什么是这样? import scala.collection.immutable._ def foo(s: Set[CharSequence]): Unit = { println(s) } def bar(): Unit = { val s: Set[String] = Set("Hello", "World"); foo(s); //DOES NOT COMPILE, regardless of whether type is declared //explicitly in the val s declaration }
我在C#上阅读的教科书中遇到过这些问题,但是由于缺乏上下文,我很难理解它们。 有一个很好的简洁的解释,他们是什么,他们在那里有什么用? 编辑澄清: 协变界面: interface IBibble<out T> . . 反变化界面: interface IBibble<in T> . .
我在理解我将如何在现实世界中使用协变和反变化有点麻烦。 到目前为止,我见过的唯一例子是旧的数组例子。 object[] objectArray = new string[] { "string 1", "string 2" }; 如果我能看到它在其他地方被使用,那么看到一个例子可以让我在开发过程中使用它。
我无法理解协方差和逆变之间的差异。
我没有参加PDC 2008,但是我听到一些消息说C#4.0被宣布支持Generic协方差和反方差。 也就是说, List<string>可以被分配给List<object> 。 那怎么可能? 在Jon Skeet的书“ 深度C#”中 ,解释了为什么C#generics不支持协方差和反方差。 主要是为了编写安全的代码。 现在,C#4.0更改为支持它们。 会不会带来混乱? 有人知道关于C#4.0的细节可以给一些解释吗?
我正在与.NET框架,我真的想能够使我的网站使用的自定义types的页面。 当我试图从控件访问页面时出现问题。 我希望能够返回我的特定types的页面,而不是默认页面。 有没有办法做到这一点? public class MyPage : Page { // My own logic } public class MyControl : Control { public MyPage Page { get; set; } }
IEnumerable<T>是co-variant,但不支持值types,只是引用types。 下面的简单代码编译成功: IEnumerable<string> strList = new List<string>(); IEnumerable<object> objList = strList; 但是从string为int会得到编译错误: IEnumerable<int> intList = new List<int>(); IEnumerable<object> objList = intList; 原因在MSDN中解释: 差异仅适用于参考types; 如果为变体types参数指定值types,则该types参数对于生成的构造types是不变的。 我search了一下,发现有些问题提到了原因是值types和引用types之间的装箱 。 但是,为什么拳击就是这个原因,这并不能说明我的心意? 有人能给一个简单和详细的解释,为什么协变和逆变不支持价值types, 拳击如何影响这个?
看来List对象不能存储在C#中的Listvariables中,甚至不能以这种方式显式地转换。 List<string> sl = new List<string>(); List<object> ol; ol = sl; 结果不能将typesSystem.Collections.Generic.List<string>隐式转换为System.Collections.Generic.List<object> 接着… List<string> sl = new List<string>(); List<object> ol; ol = (List<object>)sl; 结果无法将typesSystem.Collections.Generic.List<string>转换为System.Collections.Generic.List<object> 当然,你可以把所有的东西都从string列表中拉出来放回去,但这是一个相当复杂的解决scheme。