C# C:使用未定义的泛型类的非泛型类

C# C:使用未定义的泛型类的非泛型类,c#,generics,inheritance,C#,Generics,Inheritance,我有一个通用接口 public interface TheInterface<T> where T : IObject 然后我有一个实现接口的类 public class ClassThatWorksWithSomeObject : TheInterface<SomeObject> 这一切都很好。稍后,我添加了一个与接口类一起工作的类,该类与他使用的IOObject的版本无关 public class IDoStuffToInterface { public

我有一个通用接口

public interface TheInterface<T> where T : IObject
然后我有一个实现接口的类

public class ClassThatWorksWithSomeObject : TheInterface<SomeObject>
这一切都很好。稍后,我添加了一个与接口类一起工作的类,该类与他使用的IOObject的版本无关

public class IDoStuffToInterface
{
    public IDoStuffToInterface(TheInterface<IObject> interface)
    {
         //bla bla
    }
}
问题是我无法传递其中包含某个对象的类,即使它继承自intreface,并且它的泛型对象继承自IOObject

我想有些情况下,如果真的这样做了,可能会造成伤害,但我想不出有任何伤害


有什么办法可以做得更好吗?

我不知道具体的推动措施,你可以试试:

public interface TheInterface<out T> where T : IObject 

如果您使用的是C4.0,我不知道具体的推动方式,您可以尝试:

public interface TheInterface<out T> where T : IObject 

如果您使用的是C4.0,我认为您所做的应该是可行的,但是您可能需要使用。我认为您所做的应该是可行的,但是您可能需要使用。

您需要定义接口协变,以便它接受更广泛的IOObject类型:


您需要定义接口协变,以便它接受更广泛类型的IOObject:


在C4.0中,您应该能够通过将接口类型标记为逆变来实现这一点,但我认为您也可以通过将IDOSuff接口设置为泛型来解决这一问题

public class IDoStuffToInterface<T> where T : IObject
{
    public IDoStuffToInterface(TheInterface<T> interface)
    {
         //bla bla
    }
}

由于某个对象符合T的条件,并且与某个对象一起工作的类实现了接口,因此它应该可以作为一个参数接受。

在C4.0中,您应该能够通过将接口类型标记为逆变来实现这一点,但我认为您也可以通过将IDOSuff接口设置为泛型来解决这一问题

public class IDoStuffToInterface<T> where T : IObject
{
    public IDoStuffToInterface(TheInterface<T> interface)
    {
         //bla bla
    }
}

由于某个对象符合T的条件,并且与某个对象一起工作的类实现了接口,因此它应该可以作为一个参数接受。

tvanfosson提到的另一种方法是将IDotuff设置为通用接口类。如果接口像示例中显示的那样被传递到构造函数中,并且可能存储在类中,那么这也会很好地工作

但是,如果它只是一个函数,甚至是一个使用接口的构造函数,并且没有存储在类中,那么最好将函数本身设置为泛型,而不使用类。例如:

public class IDoStuffToInterface
{
    public void DoSomething<T>(TheInterface<T> theInterface) where T : IObject
    {
        //bla bla
    }
}
编译时不会出现任何问题,因为编译器能够通过推理判断您实际上正在调用

actor.DoSomething<SomeObject>(myObject);

现在,我认为如果您控制接口定义,使用协方差可能仍然是最好的选择。但是我想添加它作为另一个选项,当您的界面中没有那种程度的控制时。

我看到tvanfosson提到的另一种方法是将IDostfutToInterface类设置为通用类。如果接口像示例中显示的那样被传递到构造函数中,并且可能存储在类中,那么这也会很好地工作

但是,如果它只是一个函数,甚至是一个使用接口的构造函数,并且没有存储在类中,那么最好将函数本身设置为泛型,而不使用类。例如:

public class IDoStuffToInterface
{
    public void DoSomething<T>(TheInterface<T> theInterface) where T : IObject
    {
        //bla bla
    }
}
编译时不会出现任何问题,因为编译器能够通过推理判断您实际上正在调用

actor.DoSomething<SomeObject>(myObject);

现在,我认为如果您控制接口定义,使用协方差可能仍然是最好的选择。但我想添加这个选项作为另一个选项,当你的接口没有那么高的控制度时。

在C类实现接口时,它们不会从接口继承。没错,我犯了一个小错误。如果接口是抽象类而不是接口,那么协方差/逆方差就不起作用了。在C类实现接口时,它们不会继承接口。没错,我犯了一个小错误。如果接口是抽象类而不是接口,那么协方差/逆方差就不起作用了。你们大多数人的回答都是一样的,我给了你们所有的投票,但我想你们得到了正确的答案,因为你们第一个在哪里。使用此协变量是否有明显的缺点。@VAL:没有缺点,如果界面中的t用作输入,例如void AddT item,则不能使用out关键字。@VAL:此外,如果t用作返回值,例如t Getstring键,则不能使用in关键字。大多数人的回答都是相同的,我给了你们所有的投票,但我想你们得到了正确的答案,因为你们第一个在哪里。使用此协变量是否有明显的缺点。@VAL:没有缺点,如果界面中的t用作输入,例如void AddT item,则不能使用out关键字。@VAL:此外,如果t用作返回值,例如t Getstring关键字,则不能使用in关键字。