感觉题主实际上想要用C#写一个方法返回一个discrimated union。
因为题主强调的是:
用来返回不同类型的out参数
而不是返回多个out参数。
所以题主原本想像的场景大概是这样的:
enum Mode { GetInt, GetLong, GetDouble } static void Foo(Mode mode, out int i, out long l, out double d) { switch (mode) { case Mode.GetInt: i = 42; l = 0L; d = 0.0; break; case Mode.GetLong: i = 0; l = 42L; d = 0.0; break; case Mode.GetDouble: i = 0; l = 0L; d = 42.0; break; default: // ShouldNotReachHere i = 0; l = 0L; d = 0.0; break; } return; }
而题主想要把它写成:
enum Mode { GetInt, GetLong, GetDouble } static MyValue Bar(Mode mode) { MyValue val = new MyValue(); val.mode = mode; switch (mode) { case Mode.GetInt: val.i = 42; break; case Mode.GetLong: val.l = 42L; break; case Mode.GetDouble: val.d = 42.0; break; default: // ShouldNotReachHere val.l = 0L; break; } return val; }
这当然可以。这个MyValue的定义可以如下:
[StructLayout(LayoutKind.Explicit)] struct MyValue { [FieldOffset(0)] public Mode mode; [FieldOffset(8)] public int i; [FieldOffset(8)] public long l; [FieldOffset(8)] public double d; }
事实上在最新的C#标准里面新增了一个返回多个值的语法,用的就是值类型元组(结构)。所以,你的想法是对的。
在C# 7里面,返回和接收多个返回值可以这么写:
return ( a, b ); ( var a, var b ) = SomeMethod();