2014-01-25 8 views
8

In der Sprachspezifikation v5.0 C#, in Abschnitt 1.3, sagt es so:Wie kann ein Werttyp einen Schnittstellentyp implementieren?

Ein Schnittstellentyp als der Inhalt ein NULL-Verweis, einen Verweis auf eine Instanz einer Klasse-Typ, die implementiert haben Interface-Typ, oder ein Verweis auf einen boxed Wert eines Werttyp, implementiert, dass Interface-Typ

ich habe kein Problem mit zwei von drei dieser Aussagen. Der letzte verwirrt mich jedoch. Wie kann ein Schnittstellentyp einen Boxed-Wert eines Werttyps enthalten, der diesen Schnittstellentyp implementiert? Ich dachte, Werttypen könnten keine Schnittstellentypen implementieren? Oder heißt es, dass der Boxed-Wert den Interface-Typ implementiert? Wenn das der Fall ist, wie kann ein Boxed-Wert einen Schnittstellentyp implementieren?

Ich habe ein Problem, all das zu verstehen.

+0

dies eine gute Frage ist +1 für diese – alamin

Antwort

11

Werttyp (struct) kann Schnittstelle implementieren. Es kann kein anderes struct erben, aber kann Schnittstelle implementieren.

struct (C# Reference)

Structs können eine Schnittstelle implementieren, aber sie können nicht von einer anderen Struktur erben. Aus diesem Grund können Strukturelemente nicht als geschützt deklariert werden.

Also, wenn Sie haben eine struct die IInterface implementiert und Sie folgendes:

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

valueAsInterface enthält Verweis auf einen boxed Wert eines Werttyp, der diese Schnittstelle Typ implementiert.

+0

Könnte man nicht sagen, 'IInterface valueAsInterface = value'? –

+0

Ja, Sie können. Wird keinen Unterschied machen (es sei denn, der Operator cast wird in der Struktur überschrieben). – MarcinJuraszek

+1

Warum müssten Sie einen Werttyp boxen, der einen Schnittstellentyp implementiert? All dieser Jargon macht meinen Kopf in Bewegung. –

5

Es gibt nichts, das besagt, dass ein Werttyp keine Schnittstelle implementieren kann.

Der folgende Code ist vollkommen legal:

interface ITest 
{ 
    void DoSomething(); 
} 

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

Hier ein Beispiel:

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(); 
}