2013-03-14 64 views
11

我試圖弄清楚我的代碼有什麼問題。 我有這樣的代碼:繼承struct

public struct MyStructA 
{ 
    public MyStructA(string str) 
    { 
     myString= str; 
    } 

    public string myString; 
} 

public struct MyStructB: MyStructA 
{ 
    public string myReversString; 
} 

,我得到這個錯誤:

Error at compile time: Type 'MyStructA' in interface list is not an interface 

我不明白爲什麼? .net沒有像類一樣實現結構?

+0

結構和類是不同的,沒有結構類型類,它是一個或另一個。 – Freeman 2013-03-14 12:00:35

+0

必須有其他東西......那是你所有的代碼嗎? – 2013-03-14 12:00:47

回答

16

一個結構是隱式密封

根據這一link

每個結構在C#中,無論是用戶定義的還是在.NET Framework中定義的,都是封閉的 - 意味着你不能從它繼承。結構是密封的,因爲它是一個值類型,所有值類型都是密封的。

結構可以實現一個接口,所以可以在結構的名稱後面看到冒號後面的另一個類型名稱。

在下面的例子中,當我們試圖定義一個繼承自上面定義的結構的新結構時,我們得到了一個編譯時錯誤。

public struct PersonName 
{ 
    public PersonName(string first, string last) 
    { 
     First = first; 
     Last = last; 
    } 

    public string First; 
    public string Last; 
} 

// Error at compile time: Type 'PersonName' in interface list is not an interface 
public struct AngryPersonName : PersonName 
{ 
    public string AngryNickname; 
} 
3

結構不支持繼承,如果你需要,你必須使用類,見msdn

There is no inheritance for structs as there is for classes. A struct cannot inherit from another struct or class, and it cannot be the base of a class. Structs, however, inherit from the base class Object. A struct can implement interfaces, and it does that exactly as classes do.

+1

優秀的答案;坦 – 2017-08-15 06:38:50

1

結構之間不允許繼承,但結構可以實現接口。

1

MSDN;

There is no inheritance for structs as there is for classes. A struct cannot inherit from another struct or class, and it cannot be the base of a class. Structs, however, inherit from the base class Object. A struct can implement interfaces, and it does that exactly as classes do.

但請記住,因爲結構是一個值類型他們繼承System.ValueType

1

結構可以實現一個接口,但它們不能從另一個結構繼承。出於這個原因,struct成員不能被聲明爲protected。在.NET

2

值類型的,因爲它們限定儘管它們是從稱爲ValueType一類特殊的派生類,併爲每值類型有其行爲類似於一個類對象,從ValueType派生的堆對象類型奇怪,但一個值類型的存儲單元保存了一個字節集合,它或者表示一個原始值,或者是保存所有公有字段和私有字段所必需的字節連接。由於值類型的存儲位置只保存表示它們的值所需的字節,並且既不包含任何類型信息,也不包含任何對包含類型信息的對象的引用,所以使用值類型存儲位置的代碼必須確切知道它是什麼。傳統的繼承要求對象擁有關於自己類型的信息,但是沒有規定通過哪種值類型可以這樣做。

這將用於.NET是理論上可行(和有用)允許值類型繼承的一些有限的形式與一些特殊的規則,使得當一個BaseStructure變量只能容納BaseStructure,不能持有DerivedStructure,可以定義一個StructureUser<T> where T:BaseStructure,這樣的類或方法可以接受BaseStructure的任何衍生物,並使用這些成員(包括字段),這些成員對於基類型是通用的。不幸的是,定義泛型規則的方式難以在允許的場景中保持一致,並且不會破壞任何現有的代碼。例如,在一個類中Foo<T,U> where T:U它總是可以將T存儲U類型的變量,即使U爲值類型(在這種情況下,因爲值類型是密封的,TU保證是相同類型)。如果U可能是一種可繼承的價值類型,並且T可能是一種衍生品,則這種擔保不會成立。鑑於與這種繼承有關的困難,更有用的替代方案是提供一種安全的(即使有限的)方法,通過這種方法屬性可以暴露byref或const-byref(一個參數使用時,通過的參數是byref)一個ref限定符)。這樣的特性將消除字段和屬性之間不可避免的語義區別,並且取決於它如何實現可以提供一些主要的優勢,即使與類一起使用(例如,它可以允許有效混合不可變和可變類型)。