我不清楚为什么下面的代码片段不是协变的?

  public interface IResourceColl<out T> : IEnumerable<T> where T : IResource {

    int Count { get; }

    T this[int index] { get; }

    bool TryGetValue( string SUID, out T obj ); // Error here?
    }



我的界面只在输出位置使用模板参数。我可以轻松地将此代码重构为类似
  public interface IResourceColl<out T> : IEnumerable<T> where T : class, IResource {

    int Count { get; }

    T this[int index] { get; }

    T TryGetValue( string SUID ); // return null if not found
    }

但我试图了解我的原始代码是否确实违反了协方差,或者这是编译器或 .NET 协方差的限制。

最佳答案

问题确实在这里:

bool TryGetValue( string SUID, out T obj ); // Error here?

您将 obj 标记为 out 参数,这仍然意味着尽管您传入的是 obj,因此它不能是协变的,因为您都传入了 T 类型的实例并返回了它。

编辑:

埃里克·利珀特 (Eric Lippert) 说得比我提到的 his answer to "ref and out parameters in C# and cannot be marked as variant" 和引用他的关于 out 参数的任何人都好:

关于c# - 为什么 C# out 泛型类型参数违反协方差?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8913814/

10-17 01:56