协变和逆变转换失败
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 提到的特殊情况),因为它可以是您从中转换的类型的某些子类实现了接口。
我知道我遗漏了一些东西,但这不应该有用吗!?
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 提到的特殊情况),因为它可以是您从中转换的类型的某些子类实现了接口。