Discutevo l'altro giorno al workshop con Mrkino, Adrian e Gianluca di questa faccenda.
Io personalmente utilizzo molto spesso i CompareValidator con  Operator="DataTypeCheck" per validare l'input di un utente e controllare che sia un intero o un double. L'unico problema è che questo controllo controlla (scusate l'allitterazione: di domenica il mio dizionario si dimezza :)) solamente il fatto che il numero inserito sia un numero intero oppure reale (da qui il mio storcere il naso sul fatto che invece che Type="Real" lui accetti Type="Double"). Questo si traduce nel fatto che lo sviluppatore poco attento potrebbe basarsi solamente su un CompareValidator per validare un input, e quindi fare una candida Convert.ToInt32 che ovviamente fallirà miseramente nel caso l'utente inserisca un valore piu basso di  -2,147,483,648  o più alto di 2,147,483,648. E qui iniziano i problemi: questo vuol dire che in realtà il CompareValidator serve soltanto a controllare che l'input sia un numero, in virgola mobile o no, e che comunque alla base di qualsiasi convert su un input inserito dall'utente non mi posso basare su quello che mi esce dal CompareValidator. Una validazione sulla lunghezza non è la soluzione, in quanto anche se il limite fosse 9,999,999,999, comunque ci sarebbe il segno "-" a stravolgere le cose.
In conclusione, quindi, io sono costretto o a farmi un bel CustomValidator che mi controlli che il numero, oltre ad essere formalmente corretto, non ecceda un tot (uno per gli int32 ed uno per i double) oppure a farmi un controllo lato server, con tutti i dispendi che ne conseguono. Da qui ne deriva che secondo me il DataTypeCheck è praticamente inutile su Interi e su Double (non l'ho mai provato con operatore DateTime in quanto di solito utilizzo sempre Calendar o CustomControl che espongono DateTime).
Voi che ne pensate? :)