UPDATE: Các mã sau đây chỉ có ý nghĩa trong C# 4.0 (Visual Studio 2010)Hiệp phương sai/contravariance: làm thế nào để làm cho đoạn mã sau biên dịch
Nó có vẻ như tôi đang gặp một số hiểu lầm của hiệp phương sai/điều contravariance . Ai có thể cho tôi biết tại sao mã sau đây không biên dịch?
public class TestOne<TBase>
{
public IEnumerable<TBase> Method<TDerived>(IEnumerable<TDerived> values)
where TDerived: TBase
{
return values;
}
}
trong khi một biên dịch này: (!!!)
public interface IBase
{
}
public interface IDerived: IBase
{
}
public class TestTwo
{
public IEnumerable<IBase> Method(IEnumerable<IDerived> values)
{
return values;
}
}
@ Adam: Tôi tin rằng bạn là sai, 'IEnumerable' là không 'IEnumerable ' theo mặc định vì vậy nó sẽ không biên dịch thậm chí trong '3.5' –
sll
@AdamMihalcin: Không, đó là mã * sẽ không * đã biên dịch trước .NET 4. Tôi đã thử bản thân mình để xác minh điều đó. Nếu không có sự bất biến chung chung, việc chuyển đổi từ 'IEnumerable 'thành' IEnumerable 'chỉ đơn giản là không hợp lệ. –
cuộc gọi tốt trên TSuper, chỉ cần cố định rằng –