3

最近 ReSharper 在我的Visual Studio 2010解决方案中建议我可以在我的一种方法中使用可选参数。我很惊讶,因为项目的目标是 .NET 3.5,而且据我所知,可选参数是在 C# 4.0 中引入的。

但我做了一个改变,它编译了。

另一方面,我尝试了协变和逆变是否适用于.NET Framework 3.5 通用 IEnumerable,但它没有。你能告诉我我缺少什么知识吗?

4

1 回答 1

3

.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 中的通用接口变化能力——在文档中通常称为“泛型中的协变和逆变”。

于 2012-08-07T20:56:13.867 回答