C# 编译错误cs0106

修饰符“modifier”对该项无效:

类或接口成员是用无效的访问修饰符标记的。 下列示例描述了一些无效的修饰符:

  • 在接口方法上不允许使用 static 和 public 修饰符。

  • 在显式接口声明上不允许使用 public 关键字。 在这种情况下,请从显式接口声明中移除 public 关键字。

  • 在显式接口声明上不允许使用 abstract 关键字,因为显式接口实现永远不能被重写。

在以前的 Visual Studio 版本中,不允许在类上使用 static 修饰符,但允许 static 类以 Microsoft Visual Studio 2005 开头。


现在说说自己的理解:

(1)接口是要被继承的,它没有方法,属性,事件,索引器的实现,所以不能实例化,因此不能static。

(2)接口成员是自动public的,因此不能在接口的声明上添加任何访问修饰符,包括public修饰符

(3)显式接口的实现的时候,因为已经指明接口是显式的,所以在指明public就是多余的

(4)至于为什么不能用abstract,virtual关键字?VS中讲:

接口如果被基类继承实现,再被派生类继承基类,那么派生类被认为是隐式的实现接口,这个是为什么在派生类中不可以对接口重写的原因。所以我们就当这个是接口的特性吧,接口只能被实现一次,不能被重写,因此当指定了显示的接口,那就必须得去实现该接口,也不能再去重写了。

示例:

namespace ConsoleApplication10Inter
{
    interface Inter1
    {
        void func();
        //public int getIndex(string str);
        int add(int x, int y);
        int sub(int x, int y);
    }
    abstract class Class1:Inter1
    {
        //void func() { } //error,接口成员的实现方法必须是public的
        public virtual void func() { }
        public abstract int add(int x,int y);
        //abstract int Inter1.sub(int x,int y);//error,显示接口不能被声明为abstract
        //virtual int Inter1.sub() { return 0; }//error
        public int sub(int x,int y) { return 0; }

    }
}


你可能感兴趣的:(接口,C#,修饰符无效)