首先引用MSDN里的原文
Interface members are automatically public, and they can't include any access modifiers. Members also can't be static
--https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/interfaces/index
即:接口成員會自動成為公共成員,不能包含任何訪問修飾符。 成員也不能是靜態成員。
那么我們先不討論編譯器內部發生了什么,先從語法上來理解:為何Interface(接口)內的成員不能使用static修飾符。
我們知道,對一個實現接口的類,可以用顯式方式實現接口定義的成員,也可以用隱式方式來實現。
那么假設可以定義帶有一個靜態成員 StaticString() 的接口 IStatic,並定義一個類 StaticClass 顯式實現這個接口。
public Interface IStatic{ static String StaticString(); } public class StaticClass:IStatic { static IStatic.StaticString(); }
那么我們要如何使用這個靜態成員呢?既然是顯式實現,那么就要以接口的形式調用此成員。而要實現此接口,就要建立一個實例。
IStatic staticClass=new StaticClass();
String someString=IStatic.StaticString();
發現了嗎?雖然我們聲明了staticClass為一個StaticClass實例,但是我們調用成員時還是要通過IStatic接口。實際上,IStatic.StaticString()並沒有指定任何一個實例,那么使用接口成員就無從談起了。
若我們隱式實現IStatic接口:
public Interface IStatic{ static String StaticString(); } public class StaticClass:IStatic { public static String StaticString(); }
那我們就要這樣使用StaticString成員:
IStatic staticClass=new StaticClass(); String someString=StaticClass.StaticString();
同樣,雖然StaticClass實現了IStatic接口,但是在使用靜態成員時我們僅以StaticClass來進行調用,與IStatic接口沒有任何的關系。
因此,無論是顯式實現還是隱式實現接口的靜態成員,實際使用上都是沒有意義的,也就不難理解為何在C#里面為何接口成員(包括接口本身)為何不能使用static修飾詞了。
以下是筆者的閑談:
在不同的書本上已經不止一次看到對於接口修飾詞的說明了,包括C# in depth等,但是由於書中一般只會進行一兩句話的描述,因此在筆者腦海里一直沒有形成知識體系。而由於工作的性質,我也很少或者沒有用到C#里關於面向對象的性質。最近在寫一個WebAPI接口的工具類中突然要寫數個接口,突然回想起這個性質。
其實本質很簡單,但是要形成腦海里的知識體系,個人認為還是將它用最淺顯的方法演示一次更為有效。
