public static bool TryAssertType(this IEdmExpression expression, IEdmTypeReference type, out IEnumerable <EdmError> discoveredErrors) { EdmError[] edmError; EdmUtil.CheckArgumentNull <IEdmExpression>(expression, "expression"); if (type == null || type.TypeKind() == EdmTypeKind.None) { discoveredErrors = Enumerable.Empty <EdmError>(); return(true); } else { EdmExpressionKind expressionKind = expression.ExpressionKind; switch (expressionKind) { case EdmExpressionKind.BinaryConstant: case EdmExpressionKind.BooleanConstant: case EdmExpressionKind.DateTimeConstant: case EdmExpressionKind.DateTimeOffsetConstant: case EdmExpressionKind.DecimalConstant: case EdmExpressionKind.FloatingConstant: case EdmExpressionKind.GuidConstant: case EdmExpressionKind.IntegerConstant: case EdmExpressionKind.StringConstant: case EdmExpressionKind.TimeConstant: { IEdmPrimitiveValue edmPrimitiveValue = (IEdmPrimitiveValue)expression; if (edmPrimitiveValue.Type == null) { return(edmPrimitiveValue.TryAssertPrimitiveAsType(type, out discoveredErrors)); } else { return(edmPrimitiveValue.Type.TestTypeMatch(type, expression.Location(), out discoveredErrors)); } } case EdmExpressionKind.Null: { return(((IEdmNullExpression)expression).TryAssertNullAsType(type, out discoveredErrors)); } case EdmExpressionKind.Record: { IEdmRecordExpression edmRecordExpression = (IEdmRecordExpression)expression; if (edmRecordExpression.DeclaredType == null) { return(edmRecordExpression.TryAssertRecordAsType(type, out discoveredErrors)); } else { return(edmRecordExpression.DeclaredType.TestTypeMatch(type, expression.Location(), out discoveredErrors)); } } case EdmExpressionKind.Collection: { IEdmCollectionExpression edmCollectionExpression = (IEdmCollectionExpression)expression; if (edmCollectionExpression.DeclaredType == null) { return(edmCollectionExpression.TryAssertCollectionAsType(type, out discoveredErrors)); } else { return(edmCollectionExpression.DeclaredType.TestTypeMatch(type, expression.Location(), out discoveredErrors)); } } case EdmExpressionKind.Path: { return(((IEdmPathExpression)expression).TryAssertPathAsType(type, out discoveredErrors)); } case EdmExpressionKind.ParameterReference: case EdmExpressionKind.FunctionReference: case EdmExpressionKind.PropertyReference: case EdmExpressionKind.ValueTermReference: case EdmExpressionKind.EntitySetReference: case EdmExpressionKind.EnumMemberReference: { edmError = new EdmError[1]; edmError[0] = new EdmError(expression.Location(), EdmErrorCode.ExpressionNotValidForTheAssertedType, Strings.EdmModel_Validator_Semantic_ExpressionNotValidForTheAssertedType); discoveredErrors = edmError; return(false); } case EdmExpressionKind.If: { return(((IEdmIfExpression)expression).TryAssertIfAsType(type, out discoveredErrors)); } case EdmExpressionKind.AssertType: { return(((IEdmAssertTypeExpression)expression).Type.TestTypeMatch(type, expression.Location(), out discoveredErrors)); } case EdmExpressionKind.IsType: { return(EdmCoreModel.Instance.GetBoolean(false).TestTypeMatch(type, expression.Location(), out discoveredErrors)); } case EdmExpressionKind.FunctionApplication: { IEdmApplyExpression edmApplyExpression = (IEdmApplyExpression)expression; if (edmApplyExpression.AppliedFunction != null) { IEdmFunctionBase appliedFunction = edmApplyExpression.AppliedFunction as IEdmFunctionBase; if (appliedFunction != null) { return(appliedFunction.ReturnType.TestTypeMatch(type, expression.Location(), out discoveredErrors)); } } discoveredErrors = Enumerable.Empty <EdmError>(); return(true); } case EdmExpressionKind.LabeledExpressionReference: { return(((IEdmLabeledExpressionReferenceExpression)expression).ReferencedLabeledExpression.TryAssertType(type, out discoveredErrors)); } case EdmExpressionKind.Labeled: { return(((IEdmLabeledExpression)expression).Expression.TryAssertType(type, out discoveredErrors)); } default: { edmError = new EdmError[1]; edmError[0] = new EdmError(expression.Location(), EdmErrorCode.ExpressionNotValidForTheAssertedType, Strings.EdmModel_Validator_Semantic_ExpressionNotValidForTheAssertedType); discoveredErrors = edmError; return(false); } } } }