Enum.TryParse retorna true para qualquer valor numérico

Eu estou correndo em um comportamento que eu não estava esperando ao usar Enum.TryParse.

Se eu tiver um enum:

public enum MyEnum { ValueA, ValueB, ValueC } 

E então eu passo um valor numérico (como uma string) para Enum.TryParse, como:

 MyEnum outputEnum; bool result = Enum.TryParse("1234", out outputEnum); 

Apesar da string “1234” não ser um valor possível, o resultado retornará como true e meu outputEnum terá um valor de 1234.

Existe uma maneira de evitar esse tipo de comportamento? Eu estou tentando escrever uma function que processará input de seqüência de caracteres arbitrária como um enum e isso lançou um pouco de uma chave de boca na minha detecção de input incorreta.

Esse comportamento é por design.

A documentação diz:

. Se value é a representação de string de um inteiro que não representa um valor subjacente da enumeração TEnum, o método retorna um membro de enumeração cujo valor subjacente é convertido para um tipo integral. Se esse comportamento não for desejado, chame o método IsDefined para garantir que uma determinada representação de seqüência de caracteres de um inteiro seja realmente um membro do TEnum.

Chame Enum.IsDefined para se justificar que o valor que você analisou realmente existe nesse enum particular.

Se você estiver lidando com enums [flags [Flags] (bitmasks), isso ficará mais complicado.