2

我正在更多地了解这个世界。在我的测试中,我发现这很奇怪:

    [TestMethod]
    public void VarianceTest()
    {
        List<string> listValues = new List<string>();
        string[] arrayValues = listValues.ToArray();
        var result = HelperCoVariant.GetTest<int>(listValues); // error to compile
        var result2 = HelperCoVariant.GetTest<int>(arrayValues); // sucess
    }

任何方法:

public static class HelperCoVariant
{
    public static IEnumerable<T> GetTest<T>(this IEnumerable<object> t)
    {
        foreach (var item in t)
        {
            yield return (T)item;
        }
    }
}

我明白了。NET 4 完美运行,因为

IEnumerable<out T>

但是为什么。NET 3.5,有这种行为吗?

4

1 回答 1

4

倒数第二行无法编译,因为在 .NET 2/3/3.5IEnumerable<T>中没有关键字。out由于它没有out关键字,因此不能将其视为 T 中的协变。

最后一行编译是因为在 C# 的早期版本中存在数组协方差请参阅C# 中的协方差和逆变,第二部分: Eric Lippert 的数组协方差。

于 2012-12-06T19:15:38.450 回答