这段代码有点奇怪,请耐心阅读(请记住,这种情况确实在生产代码中出现过)。
假设我有以下接口结构:
public interface IBase { }
public interface IChild : IBase { }
public interface IFoo<out T> where T : IBase { }
通过这个扩展方法类构建了与接口相关的内容:
public static class FooExt
{
public static void DoSomething<TFoo>(this TFoo foo)
where TFoo : IFoo<IChild>
{
IFoo<IChild> bar = foo;
//foo.DoSomethingElse(); // Doesn't compile -- why not?
bar.DoSomethingElse(); // OK
DoSomethingElse(foo); // Also OK!
}
public static void DoSomethingElse(this IFoo<IBase> foo)
{
}
}
为什么在
DoSomething
中注释掉的那一行不能编译?编译器允许我将foo
赋值给与泛型约束相同类型的bar
,并在其上调用扩展方法,这也没有问题。也可以不使用扩展方法语法来调用扩展方法。有人能否确认这是一个错误还是预期行为?
谢谢!
仅供参考,这是编译错误(类型已缩写):
'TFoo'不包含'DoSomethingElse'的定义,最佳的扩展方法重载'DoSomethingElse(IFoo)'具有一些无效参数
out
将无法工作) - CameronIFoo
接口的out
协变泛型定义,这不是显而易见的吗? - Darin Dimitrovout T
而不是in T
。IChild无法转换为IFoo<IBase>
。 - TejsTFoo
类型。然而,在我的一些真实代码中,我对IFoo
有额外的(接口)约束。 - Cameron