0

我有以下类和接口

public interface IFoo {}

public class Foo : IFoo {}

public interface IWrapper<T> where T : IFoo {}

public class Wrapper<Foo> : IWrapper<Foo> {}

我怎样才能Wrapper<Foo>投到IWrapper<IFoo>?使用 Cast (InvalidCastException) 时引发异常,因为我在使用 as 时得到 null。

谢谢您的帮助!

更新

这是一个更具体的例子:

public interface IUser {}

public class User : IUser {}

public interface IUserRepository<T> where T : IUser {}

public class UserRepository : IUserRepository<User> {}

现在我需要能够做这样的事情:

 UserRepository up =  new UserRepository();
 IUserRepository<IUser> iup = up as IUserRepository<IUser>;

我正在使用.net 4.5。希望这可以帮助。

4

2 回答 2

5

从您的编辑中,您实际上想要:

public interface IUserRepository<out T> where T : IUser {}
public class UserRepository : IUserRepository<User> {}

那么你可以这样做:

IUserRepository<IUser> iup = new UserRepository();

请注意,如果它出现在例如定义中的任何位置的输出位置,则只能将out修饰符添加到类型参数TIUserRepository

public interface IUserRepository<out T> where T : IUser
{
    List<T> GetAll();
    T FindById(int userId);
}

如果它出现在输入位置的任何位置,例如方法参数或属性设置器,它将无法编译:

public interface IUserRepository<out T> where T : IUser
{
    void Add(T user);       //fails to compile
}
于 2013-07-30T20:15:09.810 回答
0

Wrapper<Foo>需要Wrapper<IFoo>。然后你应该可以施放它。它也需要实现接口。

下面的转换工作......我认为您不能将对象泛型类型参数转换为不同的类型(即IWrapper<Foo>to IWrapper<IFoo>)。

void Main()
{
    var foo = new Wrapper();
    var t = foo as IWrapper<IFoo>;
    t.Dump();       
}


public interface IFoo {}

public class Foo : IFoo {}

public interface IWrapper<T> where T : IFoo {}

public class Wrapper : IWrapper<IFoo> {}
于 2013-07-30T20:08:41.120 回答