在C#中,可以为类型参数添加方差注释,限定为值类型: interface IFoo<in T> where T : struct { void Boo(T x); } 为什么编译器允许这种情况下的方差注释,如果它完全没有意义?
这在C# 7.3 (Framework 4.8)中可以正确编译: (string, string) s = ("a", "b"); (object, string) o = s; 我知道这是以下代码的语法糖,而且以下代码也可以正确编译: ValueTuple<string, st...
在下面的代码片段中,我期望能够从elements隐式转换为baseElements,因为TBase可以隐式转换为IBase。 public interface IBase { } public interface IDerived : IBase { } public class Varia...
这段代码有点奇怪,请耐心阅读(请记住,这种情况确实在生产代码中出现过)。 假设我有以下接口结构: public interface IBase { } public interface IChild : IBase { } public interface IFoo<out T...
我认为协变性(至少对于对象而言)可以定义为“能够使用一个更窄(子)类型的值来代替一些更宽(超)类型的值的能力”,而逆变性则是其完全相反。 显然,Scala函数是Function[-A1,...,+B]的实例,用于逆变参数类型A1等等和协变返回类型B。虽然这对于函数的子类型很方便,但按照上述定...
我有一个 Dictionary<string, List<string>>,想将其成员公开为只读。我看到可以将其作为 IReadOnlyDictionary<string, List<string>> 返回,但我无法弄清如何将其作为 IReadO...
C# 4.0的协变和逆变支持存在一些奇怪的行为:using System; class Program { static void Foo(object x) { } static void Main() { Action<string> action = _ =...
这个问题 几小时前在这里被提出,让我意识到我从来没有在我的代码中使用过协变返回类型。对于那些不确定 covariance 是什么的人,它允许 (通常是) 虚函数的返回类型不同,只要这些类型是同一继承层次结构的一部分。例如:struct A { virtual ~A(); virtu...
我有一个对象列表,它们是我的类型QuoteHeader,我想将这个列表作为对象列表传递给能够接受List<object>的方法。 我的代码如下...Tools.MyMethod((List<object>)MyListOfQuoteHeaders); 但是在设计时我收...