2013-03-14 4 views
11

Я пытаюсь выяснить, в чем проблема с моим кодом. У меня есть этот код:Inherit from 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 не implemnet struct как класс?

+0

Структуры и классы разные, нет класса типа структуры, его либо одного, либо другого. – Freeman

+0

Должно быть что-то еще ... Это весь ваш код? –

ответ

16

на структуру неявным Sealed

Согласно этому 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

Struct не поддерживает наследование, если вам нужно, вы должны использовать класс, см 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

отличный ответ; Tanx –

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

могут реализовать Структуры интерфейса, но они не могут наследовать от другой структуры. По этой причине члены структуры не могут быть объявлены защищенными.

2

Типы значений в .net странная в том, что они определили, что они являются классами, полученные из специального класса под названием ValueType, и для каждого типа значения есть тип объекта кучи, которая ведет себя как объект класса, который является производным от ValueType, но хранилище данных типа ценности содержит коллекцию байтов, которая представляет либо примитивное значение, либо объединение байтов, необходимых для хранения всех его публичных и частных полей. Поскольку места хранения типа значений просто содержат байты, необходимые для представления их значений, и не содержат ни информации о типе, ни ссылки на объект, который будет хранить информацию о типе, код, который использует хранилище типа значения, должен точно знать, что это такое. Обычное наследование требует, чтобы объекты содержали информацию об их собственном типе, но нет никаких положений, посредством которых типы значений могли бы это сделать.

Было бы концептуально можно (и полезно) для .net, чтобы некоторые ограниченные формы наследования значения типа с некоторыми специальными правилами, например, что в то время как BaseStructure переменная может держать BaseStructure только и не мог держать DerivedStructure, можно определить StructureUser<T> where T:BaseStructure, и такой класс или метод может принимать любые производные от BaseStructure и использовать эти элементы, включая поля, которые являются общими для базового типа.К сожалению, было бы сложно определить правила для дженериков таким образом, чтобы вести себя последовательно в разрешенных сценариях и, тем не менее, не нарушать существующий код. Например, в классе Foo<T,U> where T:U это всегда можно хранить T переменного типа U, даже если U является типом значения (в этом случае, так как типы значений запечатаны, T и U гарантированы то же тип). Если U может быть наследуемым типом значений, а T может быть производным, такая гарантия не будет сохранена. Учитывая трудности, связанные с таким наследованием, более полезной альтернативой было бы предоставление безопасного (даже если ограниченного) средства, через которое свойство могло бы вызывать byref или const-byref (byref - это то, что передается при использовании параметра a ref). Такая функция устранит неизбежное семантическое различие между полями и свойствами и в зависимости от того, как оно было реализовано, может предложить некоторые основные преимущества даже при использовании с классами (например, это может обеспечить эффективное смешивание неизменяемых и изменяемых типов).