协变和逆变转换失败

Covariance and Contravariance conversion fails

我知道我遗漏了一些东西,但这不应该有用吗!?

public interface IFoo<out TA, in TB>
    where TA : class
    where TB : class
{
}
public class Foo<T> : IFoo<T, T> where T : class { }
public class Whatever { }

...

Foo<Whatever> _Foo = new Foo<Whatever>(); // (changed "Foo" to "_Foo to be more clear)
var f = (IFoo<object, object>)_Foo; // CAST ERROR

仅供参考:原始项目是使用 VS 2013 的 .NET 4.0。

编辑: 'TB' 参数(逆变)的 'in' 类型似乎必须是相同类型或派生类型。由于 'object' 是超类型(例如,'object' 不是从类型 'Whatever' 派生的),转换失败。 (感谢 Aasmund Eldhuset)

这确实有效:

public class WhateverB : Whatever { }
var f = (IFoo<object, WhateverB>)Foo; // YAY ;)

A Foo<string> 不是 IFoo<object, object>,因为通用类型参数 TB 不匹配 - 对于 in 泛型类型参数,实际类型必须等于泛型类型参数或者是泛型类型参数的超类,但是 string 不是 object.

的超类

编译器接受强制转换的原因是向接口类型的强制转换几乎总是合法(除了 PetSerAl 提到的特殊情况),因为它可以是您从中转换的类型的某些子类实现了接口。