c# - 泛型、协变/逆变等

标签 c# java oop generics

所以我有一些 Java 代码广泛使用编译得很好的泛型。我将它移植到 C# 如下:

interface IFoo1 { }
interface IFoo2 { }

interface IBar<T, K>
    where T : IFoo1
    where K : IFoo2 {
    List<T> GetFoo1s();
    void AddAFoo1(T foo1);

    List<K> GetFoo2s();
    void AddAFoo2(K foo2);
}

interface IBlip<T>
    where T : IBar<IFoo1, IFoo2> {
    T DoBlip(string input);
    void DoBlip2(T input);
}

interface IConverter<T, K>
    where T : IBar<IFoo1, IFoo2>
    where K : IBar<IFoo1, IFoo2> {
    K Convert(T input);
}

class FooA1 : IFoo1 { }
class FooB1 : IFoo1 { }

class FooA2 : IFoo2 { }
class FooB2 : IFoo2 { }

class BarA : IBar<FooA1, FooA2> {
    public List<FooA1> GetFoo1s() { return null;  }
    public void AddAFoo1(FooA1 foo1) { }
    public List<FooA2> GetFoo2s() { return null; }
    public void AddAFoo2(FooA2 foo2) { }
}

class BarB : IBar<FooB1, FooB2> {
    public List<FooB1> GetFoo1s() { return null; }
    public void AddAFoo1(FooB1 foo1) { }
    public List<FooB2> GetFoo2s() { return null; }
    public void AddAFoo2(FooB2 foo2) { }
}

class BlipA : IBlip<BarA> {
    public BarA DoBlip(string input) { return null; }
    public void DoBlip2(BarA input) { }
}

class BlipB : IBlip<BarB> {
    public BarB DoBlip(string input) { return null; }
    public void DoBlip2(BarB input) { }
}

class ConverterImplementation : IConverter<BarA, BarB> {
    public BarB Convert(BarA input) {
        return null;
    }
}

当我编译它时,它会提示,例如,对于 ConverterImplementation,BarA 无法隐式转换为 IBar。我想我从根本上缺少一些东西。有人可以阐明一下吗?谢谢。

最佳答案

默认情况下,泛型类型参数既不是逆变也不是协变,但可以通过“in”和“out”关键字使其成为其中之一。

在 IBar 的情况下,两种类型参数都用作输入和输出,因此您不能使它们逆变或协变。如果将其重构为两个接口(interface),一个是 T 仅用于输入,K 仅用于输出,另一个是 T 仅用于输出,K 仅用于输入,那么您可以使每个类型参数基于协变或逆变关于它的使用。

关于c# - 泛型、协变/逆变等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15579732/

相关文章:

c# - 通过自连接更新 List<T>?

c# - View 模型中的 MVVM 异步调用 : How can I connect azure DB with MVVM

c# - SQLSERVER : Can it be enabled differently? 中所有著名的 SA 登录

c++ - 我应该更喜欢点 (.) 还是箭头 (->) 运算符来访问 C++ 中的指针成员?

c# - 为什么 "my,string".Split (',' ) 在 .NET C# 中有效

java - Selenium 测试在谷歌反向查找时自动完成失败

java方法重载为不同的方法共享相同的内存或不同的内存

java - protected "stub"方法仅用于覆盖目的是否被视为良好做法?

c++ - getInstance() 是如何工作的?

java - Red5 java启动时出错