如何设置显式实现的接口属性?编译错误修复方法
问题原因与修复方案
你碰到的编译错误,核心原因是显式接口实现的特性:当你用int Imy.X这种语法实现接口成员时,这个成员会被“隐藏”,只能通过接口类型的引用访问,不能直接通过实现类的实例调用。
下面给你两种可行的修复方式:
方式一:改用隐式接口实现
如果不需要隐藏接口的X属性,把显式实现改成常规的隐式实现即可,这样MyImpl的实例能直接访问X:
public interface Imy { int X { get; set; } } public class MyImpl : Imy { private int _x; // 去掉接口名称前缀,改成隐式实现 public int X { get => _x; set => _x = value; } } class Program { static void Main(string[] args) { var o = new MyImpl(); o.X = 3; // 现在可以正常赋值了 } }
方式二:保留显式实现,通过接口类型访问
如果必须保留显式实现(比如类需要实现多个包含同名成员的接口,或者想对外隐藏这个接口成员),只需要把实例转换成接口类型再赋值:
public interface Imy { int X { get; set; } } public class MyImpl : Imy { private int _x; int Imy.X { get => _x; set => _x = value; } } class Program { static void Main(string[] args) { var o = new MyImpl(); // 方法1:强制转换为接口类型后赋值 ((Imy)o).X = 3; // 方法2:直接声明接口类型的变量 Imy oAsImy = new MyImpl(); oAsImy.X = 3; } }
简单总结下:显式实现的接口成员是属于接口的,不是属于实现类的,所以必须通过接口引用来访问;隐式实现的成员则属于实现类,实例可以直接调用。
内容的提问来源于stack exchange,提问作者Troskyvs
相关产品推荐
相关产品推荐

