[英]Error when passing an object that implements interface X to an interface Y that inherits from interface X. in C#
当前,当将实现接口X的对象传递给从接口XI继承的接口Y时,会收到以下错误消息:
无法将类型'InterfaceTestApp.Repositories.IUserModel'隐式转换为'InterfaceTestApp.Lib.IUserModel'。 存在显式转换(您是否缺少演员表?)
这是我的测试设置:
资料库
namespace InterfaceTestApp.Repositories
{
public class UserTestRepo
{
public IUserModel GetUser() => new UserModel() { Id = 1, Name = "Test" };
}
}
namespace InterfaceTestApp.Repositories
{
public interface IUserModel
{
int Id { get; set; }
string Name { get; set; }
}
public class UserModel : IUserModel
{
public int Id { get; set; }
public string Name { get; set; }
}
}
图书馆
namespace InterfaceTestApp.Lib
{
interface IUserModelLib : Repositories.IUserModel { }
}
namespace InterfaceTestApp.Lib
{
class Authentication
{
public IUserModelLib AuthenticateUser() => new Repositories.UserTestRepo().GetUser();
}
}
基本上,我在这里要做的是避免将Repo项目的任何部分暴露给使用Lib项目的任何应用程序。 如您所见,IUserModelLib只是一个传递接口。 它从回购项目中的IUserModel继承了所有内容。
应该有一种方法可以执行此操作,而不必进行某种手工转换。 任何帮助,将不胜感激。 谢谢!
您在这里混淆了继承的顺序/方向。
Lib.IUserModelLib
实现Repositories.IUserModel
UserModel
实现Repositories.IUserModel
仅仅因为它们共享一个公共接口并不意味着可以将UserModel
分配给Lib.IUserModelLib
。
Repositories.UserTestRepo().GetUser()
返回一个Repositories.IUserModel
AuthenticateUser()
需要返回Repositories.IUserModel
而不是Lib.IUserModelLib
基本上,我在这里要做的是避免将Repo项目的任何部分暴露给使用Lib项目的任何应用程序。 如您所见,IUserModelLib只是一个传递接口。 它从回购项目中的IUserModel继承了所有内容。
在那种情况下,您需要包装UserModel
类而不是IUserModel
接口,将类设置为internal
而不是public
并定义您的friend-assembly 。 这样,您可以在Lib项目中使用UserModel
,而无需将其暴露给使用Lib的任何项目。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.