Abaixo vamos ver um exemplo de utilização de as e cast e depois suas diferenças.
//Objeto
object obj = "codebreak";
//cast
string nome = (string)obj;
//as
string nome2 = obj as string;
Cast - (string)obj
- Se a conversão falhar, vai retornar InvalidCastException
- Se o valor for null vai gerar um NullReferenceException.
As - obj as string;
- Se a conversão falhar, retorna null.
- Nunca vai gerar um InvalidCastException.
- Não pode ser utilizado com tipo de valor não anulável (int, decimal, boolean...), a não ser que seja definido como nullable (int?, decimal?, boolean?...)
/*Erro de Compilação
The as operator must be used with a reference type or nullable type
('int' is a non-nullable value type)*/
int i = (object)1 as int;
//Vai funcionar, pois foi definido como nullable
int? i = (object)1 as int?;
bool? b = (object)true as bool?;
Mais alguns testes.
string nome;
object obj;
obj = "codebreak";
//Resultado: codebreak
nome = (string)obj;
obj = 1;
nome = (string)obj;
//Resultado: System.InvalidCastException
obj = null;
nome = (string)obj;
//Resultado: null
int i = (int)obj;
//Resultado: System.NullReferenceException
obj = "codebreak";
nome = obj as string;
//Resultado: codebreak
obj = 1;
nome = obj as string;
//Resultado: null
obj = null;
nome = obj as string;
//Resultado: null