是否可以在c#中使用别名数组类型?

Sta*_*zev 7 c# arrays alias types

我正在尝试使用自定义异常类型执行一些序列化/反序列化的东西.此类型的字段定义为:

private object[] resourceMessageParams;
Run Code Online (Sandbox Code Playgroud)

我有一些很好的和强类型的代码与一些Linq表达魔术,但我想更进一步,并做这样的事情:

using ResourceMessageParamsType = object[];//<-- "Identifier expected" error here
/*...*/
private ResourceMessageParamsType resourceMessageParams;
/*...*/
this.resourceMessageParams = 
    (ResourceMessageParamsType)serializationInfo.GetValue(
        ReflectionHelper.GetPropertyNameFromExpression(() => 
            resourceMessageParams), typeof(ResourceMessageParamsType));
Run Code Online (Sandbox Code Playgroud)

而不是这个:

(object[])serializationInfo.GetValue(
    ReflectionHelper.GetPropertyNameFromExpression(() => 
        resourceMessageParams), typeof(object[]));
Run Code Online (Sandbox Code Playgroud)

为了适应将来可能更改此字段的类型,因此必须在别名定义中仅更改一次类型.但是,编译器停止在objectusing ResourceMessageType = object[];抱怨的标识符的预期.更改为Object[]有所帮助,但这次括号突出显示相同的错误消息.

有没有办法在c#中为数组类型定义别名?

小智 9

您可以定义一个名为ResourceMessageParamsType的类(或结构),并定义用于与object []进行转换的隐式运算符.

struct ResourceMessageParamsType
{
    private object[] value;

    private ResourceMessageParamsType(object[] value)
    {
        this.value = value;
    }

    public static implicit operator object[](ResourceMessageParamsType t)
    {
        return t.value;
    }

    public static implicit operator ResourceMessageParamsType(object[] value)
    {
        return new ResourceMessageParamsType(value);
    }
}
Run Code Online (Sandbox Code Playgroud)


Meh*_*dad 4

简而言之,您不能“别名”数组类型。

您可以通过将内容封装在 a 中来解决它struct,但这并不能回答您的问题。


更新:

从ECMA标准来看,

使用别名指令:

using 标识符=命名空间或类型名称

这显然没有说明任何关于允许数组的事情。

(有关如何定义命名空间或类型名称的信息,请参阅第 100 页。)