Questions tagged «covariance»

协方差,相反方差和不变性描述了现有类型继承层次结构在进行某种转换(例如泛型中的用法)时如何变化。如果转换保持原始层次结构的顺序,则它是“协变量”。如果反转,则为“相反”。如果它破坏了它,则它是“不变的”。

14
在C#中,为什么List <string>对象不能存储在List <object>变量中
似乎List对象不能存储在C#中的List变量中,甚至不能以这种方式显式转换。 List&lt;string&gt; sl = new List&lt;string&gt;(); List&lt;object&gt; ol; ol = sl; 结果无法将类型隐式转换System.Collections.Generic.List&lt;string&gt;为System.Collections.Generic.List&lt;object&gt; 然后... List&lt;string&gt; sl = new List&lt;string&gt;(); List&lt;object&gt; ol; ol = (List&lt;object&gt;)sl; 结果无法将类型转换System.Collections.Generic.List&lt;string&gt;为System.Collections.Generic.List&lt;object&gt; 当然,您可以通过将所有内容从字符串列表中拉出并一次放回一个列表中来完成此操作,但这是一个相当复杂的解决方案。

9
C#是否支持返回类型协方差?
我正在使用.NET框架,但我确实希望能够制作一种供我所有网站使用的自定义类型的页面。当我尝试从控件访问页面时,问题就来了。我希望能够返回我的特定页面类型而不是默认页面。有什么办法吗? public class MyPage : Page { // My own logic } public class MyControl : Control { public MyPage Page { get; set; } }
84 c#  covariance 

15
C#:覆盖返回类型
有没有办法在C#中覆盖返回类型?如果是这样,怎么做,如果不是,为什么,推荐的做事方式是什么? 我的情况是我有一个带有抽象基类及其后代的接口。我想这样做(虽然不行,但是举个例子!): public interface Animal { Poo Excrement { get; } } public class AnimalBase { public virtual Poo Excrement { get { return new Poo(); } } } public class Dog { // No override, just return normal poo like normal animal } public class Cat { public override …

2
scala-泛型中的任何vs下划线
Scala中以下泛型定义之间的区别是什么: class Foo[T &lt;: List[_]] 和 class Bar[T &lt;: List[Any]] 我的直觉告诉我它们大致相同,但后者更明确。我发现前者可以编译但后者不能编译的情况,但不能使我完全了解。 谢谢! 编辑: 我可以混入另一个吗? class Baz[T &lt;: List[_ &lt;: Any]]

7
如何将协变返回类型与智能指针一起使用?
我有这样的代码: class RetInterface {...} class Ret1: public RetInterface {...} class AInterface { public: virtual boost::shared_ptr&lt;RetInterface&gt; get_r() const = 0; ... }; class A1: public AInterface { public: boost::shared_ptr&lt;Ret1&gt; get_r() const {...} ... }; 此代码无法编译。 在Visual Studio中,它引发了 C2555:覆盖虚拟函数的返回类型不同并且不是协变的 如果我不使用boost::shared_ptr而是返回原始指针,则代码会编译(我理解这是由于C ++中的协变返回类型所致)。我可以看到这个问题是因为boost::shared_ptr的Ret1不是源自boost::shared_ptr的RetInterface。但是我想返回boost::shared_ptrofRet1以用于其他类,否则我必须在返回之后强制转换返回的值。 难道我做错了什么? 如果不是,为什么这样的语言-在这种情况下,应该可以扩展以处理智能指针之间的转换?有理想的解决方法吗?

1
是什么使ValueTuple协变?
这可以在C#7.3(框架4.8)中正确编译: (string, string) s = ("a", "b"); (object, string) o = s; 我知道这是下面的语法糖,它也可以正确编译: ValueTuple&lt;string, string&gt; s = new ValueTuple&lt;string, string&gt;("a", "b"); ValueTuple&lt;object, string&gt; o = s; 因此,看来ValueTuples可以协变地分配,真棒! 不幸的是,我不明白为什么:我给人的印象是C#只支持interface和委托的协方差。ValueType两者都不是。 实际上,当我尝试使用自己的代码复制此功能时,将失败: struct MyValueTuple&lt;A, B&gt; { public A Item1; public B Item2; public MyValueTuple(A item1, B item2) { Item1 = item1; Item2 = …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.