如果在接口中用作协变类型参数的类型是 a ,则以下测试失败(在最后一个 Assert 上)struct
,但如果它是 a 则成功class
。
interface IOuter { }
interface IOuter<out T> : IOuter { T Value { get; } }
interface IInner { }
struct Inner : IInner { }
class Outer : IOuter<Inner> { public Inner Value { get { return new Inner(); } } }
[TestMethod()]
public void ContravarianceTest()
{
var a = new Outer();
Assert.IsTrue(a is IOuter<Inner>);
// Fails here if Inner is a struct. Succeeds if Inner is a class.
Assert.IsTrue(a is IOuter<IInner>);
}
为什么结构和类之间有区别?