最近,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 编译器结合使用时仅适用于您自己的类型。此代码在 .NET Framework 3.5 上使用 C# 4 编译器也可以顺利编译。
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中添加的泛型接口方差功能——通常在文档中称为“泛型中的协变和逆变”。