Uma exceção de incompatibilidade de matriz ocorre quando um tipo de dados incompatível é adicionado a uma matriz. Isso pode ser visto em tempo de compilação e tempo de execução.
Os erros em tempo de compilação são fáceis de ver, isso ocorre porque um int não tem uma classe base de string.
Código para gerar erro em tempo de compilação:
string[] test = new string[] { "a" };
test[0] = 2;
Os erros de tempo de execução são um pouco mais enigmáticos. Este erro não é detectado durante a compilação porque a classe base não foi violada. Strings podem ser lançados como objetos, uma vez que são herdados de Object. No entanto, um objeto não pode ser colocado de volta na matriz após a divisão. Split retorna uma matriz de string e converte implicitamente a matriz de objeto como uma matriz de string. Como String é uma classe derivada, a nova chamada de object () causa um erro de incompatibilidade, já que object () não tem uma classe base de String. Mesmo um elenco explícito não pode nos salvar.
Para contornar esse erro, atribuo individualmente a string a cada elemento da matriz de objeto. Os tipos não são violados porque String é um derivado de Object.
public class Array_Mismatch
{
public static void arrayMismatchTest()
{
createMismatchError(); //String[], Attempted to access an element as a type incompatible with the array.
createWorkAround(); //Object[], System.Object can be added to the array.
}
private static void createMismatchError()
{
string type = string.Empty;
try
{
//instantiate an object[], but pass into it string[]
object[] array = (object[])("here|comes|an|error".Split('|'));
//get the type to show the implicit conversion
type = array.GetType().Name;
//attempt to replace the first element with an object
array[0] = new object();
//print the array (this will not print due to ArrayTypeMismatchError)
Console.WriteLine(string.Format("{0}, {1}", type, string.Join(" ", array)));
}
catch (ArrayTypeMismatchException ex)
{
//this will fire, as the object array has been implicitly cast as a string array by the split return
Console.WriteLine(ex.Message);
}
}
private static void createWorkAround()
{
string type = string.Empty;
try
{
//split the string array
string[] split = "???|can|be|added|to|the|array.".Split('|');
//instantiate an object[]
object[] array = new object[split.Length];
//iterate over the split array adding to the object array
for (int i = 0; i < split.Length; i++)
array[i] = split[i];
//get the type to show no conversion
type = array.GetType().Name;
//assign a new object to the array at the first element
array[0] = new object();
//print the array (this will not print due to ArrayTypeMismatchError)
Console.WriteLine(string.Format("{0}, {1}", type, string.Join(" ", array)));
}
catch (ArrayTypeMismatchException ex)
{
//this will not fire
Console.WriteLine(ex.Message);
}
}
}
Leitura adicional:
Eric Lippert sobre covariância e compatibilidade de objetos