可选参数适用于目标框架 3.5,而泛型的协变性和逆变性不适用。

3

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

但我进行了更改,它编译通过了。

另一方面,我尝试使用.NET Framework 3.5泛型IEnumerable测试协变和逆变是否有效,但没有成功。请问我缺少了哪些知识?

1个回答

3

泛型接口和委托的差异在 .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中添加的泛型接口方差功能——通常在文档中称为“泛型中的协变和逆变”。


谢谢!实际上更令人惊讶的是,它使用 C# 4 编译器和 .NET Framework 2.0 进行了编译。 - dragonfly
2
方差在.NET中一直存在,例如引用类型的数组一直是协变的。此外,方法组方差自.NET 2.0以来就存在。你所说的是C# 4中添加的泛型接口方差功能,通常在文档中称为“泛型中的协变和逆变”。 - Peter Ritchie
@PeterRitchie 你说得完全正确,谢谢你提醒我。希望你不介意我将这个评论纳入我的答案以确保正确性。 - vcsjones

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接