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.5にキーワードがないため、最後から2番目の行はコンパイルされIEnumerable<T>ません。outキーワードがないためout、Tでは共変として扱うことはできません。

以前のバージョンのC#には配列の共分散があるため、最後の行がコンパイルされます。C#の共分散と反変性、パート2:EricLippertによる配列共分散を参照してください。

于 2012-12-06T19:15:38.450 に答える