2014-01-25 2 views
8

В C# Язык Specification v5.0, в разделе 1.3, говорит, что это:Как тип значения реализует тип интерфейса?

тип

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

у меня нет никаких проблем с двумя из трех этих заявлений. Однако последнее меня смущает. Как тип интерфейса может содержать значение в виде столбцов типа значения, которое реализует этот тип интерфейса? Я думал, что типы значений не могут реализовывать типы интерфейсов? Или он говорит, что значение в штучной упаковке реализует тип интерфейса? Если это так, то как может в штучной упаковке реализовать тип интерфейса?

У меня возникает проблема с пониманием всего этого.

+0

это хороший вопрос +1 для этого – alamin

ответ

11

Тип значения (struct) can реализация интерфейса. Он не может наследовать другой struct, но может реализовать интерфейс.

struct (C# Reference)

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

Так что, когда у вас есть struct, который реализует IInterface и вы следующее:

var value = new MyStruct(); 
var valueAsInterface = (IInterface)value; 

valueAsInterface содержит ссылки на коробочное значение типа значения, который реализует этот тип интерфейса.

+0

могли бы вы не сказать 'IInterface valueAsInterface = value'? –

+0

Да, вы можете. Не будет иметь никакого значения (если оператор трансляции не переопределяется в структуре). – MarcinJuraszek

+1

Зачем вам нужно вводить тип значения, который реализует тип интерфейса? Весь этот жаргон поворачивает мою голову. –

5

Нет ничего, что говорит о том, что тип значения не может реализовать интерфейс.

Следующий код является совершенно законным:

interface ITest 
{ 
    void DoSomething(); 
} 

struct MyTest : ITest 
{ 
    public void DoSomething() 
    { 
     // do something 
    } 
} 
1

Вот пример:

interface DisplayMsg 
{ 
    void ShowMsg(); 
} 
/// <summary> 
/// Interface implemented by Struct 
/// </summary> 
struct StructDisplayMsg : DisplayMsg 
{ 

    public void ShowMsg() 
    { 
     Console.WriteLine("Inside struct Showmsg:"); 
    } 
} 
/// <summary> 
/// Interface implemented by Class 
/// </summary> 
class ObjectDisplayMsg:DisplayMsg 
{ 
    public int Integer { get; set; } 

    public void ShowMsg() 
    { 
     Console.WriteLine("Inside Object ShowMsg:{0}", Integer); 
    } 
    /// <summary> 
    /// Implicit operator for boxing value type to object 
    /// </summary> 
    /// <param name="value"></param> 
    /// <returns></returns> 
    public static implicit operator ObjectDisplayMsg(int value) 
    { 
     ObjectDisplayMsg classObject = new ObjectDisplayMsg(); 
     classObject.Integer = value; 
     return classObject; 
    } 
} 

private void CheckConcepts() 
{ 
    StructDisplayMsg localDisplay = new StructDisplayMsg(); 
    localDisplay.ShowMsg(); 

    int localInteger = 10; 
    /* Boxing of the integer type to Object */ 
    ObjectDisplayMsg intobject = (ObjectDisplayMsg)localInteger; 
    intobject.ShowMsg(); 
    Console.ReadKey(); 
} 
Смежные вопросы