与同事一起挑战是否有任何方法可以将结构转换为类(这里是我们尝试过的示例)
namespace ConsoleApplication22
{
class Program
{
static void Main(string[] args)
{
IFoo fooS = new FooStruct();
fooS.Val = 5;
FooClass foo =(FooClass) fooS;
}
}
public interface IFoo
{
int Val { get; set; }
}
public struct FooStruct : IFoo
{
public int Val { get; set; }
}
public class FooClass : IFoo
{
//public FooClass(int val)
//{
//}
private int val;
public int Val
{
get { return val; }
set { val = value; }
}
}
}
但是我们遇到了无效的转换异常:D
考虑到接口(interface)是引用类型并且类是引用类型并且类实现了接口(interface),是否有任何棘手的方法来提取接口(interface)并将其分配给类
最佳答案
您不能通过接口(interface)直接在两者之间进行转换,这是不允许的,因为它们彼此不直接相关(即继承)。
编译器可以捕获很多此类内容,甚至不允许强制转换进行编译。如果编译器无法执行此操作,则运行时会执行此操作。对于显式转换,运行时将在失败的转换时引发异常,对于隐式转换(仅限引用类型)的尝试,运行时将返回 null 并且不会引发异常。
类型检查实际上检查 FooStruct
是 FooClass
,但事实并非如此。
但是,您可以使用强制转换运算符在它们之间进行转换,使其看起来像强制转换
class Program
{
static void Main(string[] args)
{
FooStruct f = new FooStruct();
f.Val = 2;
FooClass f2 = (FooClass)f;
Console.Read();
}
}
class FooClass : IFoo
{
public static explicit operator FooClass(FooStruct f)
{
FooClass foo = new FooClass();
foo.Val = f.Val;
return foo;
}
public int Val { get; set; }
}
struct FooStruct : IFoo
{
public int Val { get; set; }
public static explicit operator FooStruct(FooClass f)
{
FooStruct foo = new FooStruct();
foo.Val = f.Val;
return foo;
}
}
// This interface has little use in this scenario.
interface IFoo
{
int Val { get; set; }
}
不要将转换与转换混淆。另外,在将接口(interface)应用于 struct 类型时要小心,因为可能会发生装箱。
关于c# - 将结构转换为继承自同一接口(interface)的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27940438/