最近 ReSharper 在我的Visual Studio 2010解决方案中建议我可以在我的一种方法中使用可选参数。我很惊讶,因为项目的目标是 .NET 3.5,而且据我所知,可选参数是在 C# 4.0 中引入的。
但我做了一个改变,它编译了。
另一方面,我尝试了协变和逆变是否适用于.NET Framework 3.5 通用 IEnumerable,但它没有。你能告诉我我缺少什么知识吗?
.NET Framework 2.0 中引入了泛型接口和委托的变体,但只有在 C# 4.0 编译器能够利用它之前,开发人员才可以使用。
直到 .NET Framework 4 才针对这种类型的差异更新了框架的库类型。.NET 3.5 泛型变体适用于 C# 4 编译器,但仅适用于您自己的类型。这在带有 C# 4 编译器的 .NET Framework 3.5 上编译得很好。
public interface IFoo<out T>
{
T Bar();
}
public class Baz<T> : IFoo<T>
{
public T Bar()
{
return default(T);
}
}
public class Program
{
static void Main()
{
IFoo<IConvertible> foo = new Baz<string>();
}
}
彼得·里奇(Peter Richie)留下了一条具有足够重要性的评论,它应该成为答案的一部分:
方差在 .NET 中一直存在,例如引用类型的数组一直是协变的。同样,自 .NET 2.0 以来,方法组差异一直存在。您所说的是添加到 C# 4 中的通用接口变化能力——在文档中通常称为“泛型中的协变和逆变”。