在C#语言规范v5.0中,在第1.3节中,它说:
接口类型可以以空引用、对实现该接口类型的类类型实例的引用或对实现该接口类型的值类型的装箱值的引用作为其内容
我对其中三个发言中的两个没有异议。然而,最后一个让我感到困惑。接口类型如何保存实现该接口类型的值类型的装箱值?我认为值类型不能实现接口类型?还是说装箱值实现了接口类型?如果是这样的话,装箱的值如何实现接口类型?
我有点搞不懂这一切。
发布于 2014-01-25 00:15:37
值类型(struct) 可以实现接口。它不能继承另一个struct,但可以实现接口。
struct (C# Reference) Structs可以实现接口,但它们不能从其他结构继承。因此,结构成员不能声明为受保护的。
因此,当您有一个实现struct的IInterface并执行以下操作时:
var value = new MyStruct();
var valueAsInterface = (IInterface)value;valueAsInterface包含对实现该接口类型的值类型的装箱值的引用。
发布于 2014-01-25 00:16:49
没有什么能说明值类型不能实现接口。
以下代码是完全合法的:
interface ITest
{
void DoSomething();
}
struct MyTest : ITest
{
public void DoSomething()
{
// do something
}
}发布于 2014-01-25 08:37:27
下面是一个示例:
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();
}https://stackoverflow.com/questions/21344806
复制相似问题