C# 为什么我的WCF服务代理在使用枚举类型时会创建一个奇怪的方法?

C# 为什么我的WCF服务代理在使用枚举类型时会创建一个奇怪的方法?,c#,.net,wcf,C#,.net,Wcf,我在WCF服务器端定义了以下枚举: [DataContract] public enum CarConditionEnum { [EnumMember] New, [EnumMember] Used, [EnumMember] Rental, [EnumMember] Broken, [EnumMember] Stolen } 我将使用的操作合同方法接口方法,也是服务器端: [OperationContract]

我在WCF服务器端定义了以下枚举:

[DataContract]
public enum CarConditionEnum {
    [EnumMember]
    New,
    [EnumMember]
    Used,
    [EnumMember]
    Rental,
    [EnumMember]
    Broken,
    [EnumMember]
    Stolen
}
我将使用的操作合同方法接口方法,也是服务器端:

[OperationContract]
string WhatEnumDidIUse(CarConditionEnum carCondition);
public string WhatEnumDidIUse(CarConditionEnum carCondition) {
    return carCondition.ToString();
}
此接口的方法实现(服务器端):

当我动态生成此服务的代理时,它生成的方法如下所示(如果我使用web引用生成它,我非常确定它的外观将相同):

//
[System.Web.Services.Protocols.SoapDocumentMethodAttribute(“http://tempuri.org/IService1/WhatEnumDidIUse,RequestNamespace=http://tempuri.org/,ResponseNamespace=http://tempuri.org/,Use=System.Web.Services.Description.SoapBindingUse.Literal,ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
[返回:System.Xml.Serialization.xmlementAttribute(IsNullable=true)]
公共字符串WhateNumDiDiIUSE(指定了CarConditionEnum carCondition,[System.Xml.Serialization.XmlIgnoreAttribute()]bool carCondition){
object[]results=this.Invoke(“whatenumdiiuse”,新对象[]{carCondition,carConditionSpecified});
返回((字符串)(结果[0]);
}
为什么现在有这个布尔值来指定已指定的可枚举项


还有,为什么这个布尔值表现得很奇怪?例如,如果我将布尔参数设置为false,我的方法将始终返回第一个可枚举项New。如果我将布尔参数设置为true,它将返回我实际指定的任何可枚举项。

这是因为布尔值指示是否提供了enum参数。如果不是,那么它的行为就好像您为枚举提供了整数值零一样

话虽如此,我不明白为什么会有“*指定的”。根据您的代码,枚举必须始终存在。如果您指定了
CarConditionEnum?
,那么我会理解它


你确定这是WCF服务吗?这看起来像是ASMX的开场白。

是的,但这是默认行为吗?要使用这种方法来处理方法参数的默认值,这只适用于基元类型。如果您传递的是引用类型,那么
null
将用于“未指定”的情况。因此,这本质上是检测此参数是否实际随方法调用一起提供的最佳方法?这是一个WCF服务,但我正在创建对它的web引用,并从WSDL编译它。我想它必须支持ASMX,否则我的代理将无法工作。枚举类型参数是否总是添加一个布尔值来检查它们是否已被指定?
/// <remarks/>
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/IService1/WhatEnumDidIUse", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
[return: System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
public string WhatEnumDidIUse(CarConditionEnum carCondition, [System.Xml.Serialization.XmlIgnoreAttribute()] bool carConditionSpecified) {
    object[] results = this.Invoke("WhatEnumDidIUse", new object[] {carCondition, carConditionSpecified});
    return ((string)(results[0]));
}