59 lines
1.4 KiB
Plaintext
59 lines
1.4 KiB
Plaintext
Array covariance is the principle that if an implicit or explicit reference conversion exits from type ``++A++`` to ``++B++``, then the same conversion exists from the array type ``++A[]++`` to ``++B[]++``.
|
|
|
|
|
|
While this array conversion can be useful in readonly situations to pass instances of ``++A[]++`` where ``++B[]++`` is expected, it must be used with care, since assigning an instance of ``++B++`` into an array of ``++A++`` will cause an ``++ArrayTypeMismatchException++`` to be thrown at runtime.
|
|
|
|
|
|
== Noncompliant Code Example
|
|
|
|
----
|
|
abstract class Fruit { }
|
|
class Apple : Fruit { }
|
|
class Orange : Fruit { }
|
|
|
|
class Program
|
|
{
|
|
static void Main(string[] args)
|
|
{
|
|
Fruit[] fruits = new Apple[1]; // Noncompliant - array covariance is used
|
|
FillWithOranges(fruits);
|
|
}
|
|
|
|
// Just looking at the code doesn't reveal anything suspicious
|
|
static void FillWithOranges(Fruit[] fruits)
|
|
{
|
|
for (int i = 0; i < fruits.Length; i++)
|
|
{
|
|
fruits[i] = new Orange(); // Will throw an ArrayTypeMismatchException
|
|
}
|
|
}
|
|
}
|
|
----
|
|
|
|
|
|
== Compliant Solution
|
|
|
|
----
|
|
abstract class Fruit { }
|
|
class Apple : Fruit { }
|
|
class Orange : Fruit { }
|
|
|
|
class Program
|
|
{
|
|
static void Main(string[] args)
|
|
{
|
|
Orange[] fruits = new Orange[1]; // Compliant
|
|
FillWithOranges(fruits);
|
|
}
|
|
|
|
static void FillWithOranges(Orange[] fruits)
|
|
{
|
|
for (int i = 0; i < fruits.Length; i++)
|
|
{
|
|
fruits[i] = new Orange();
|
|
}
|
|
}
|
|
}
|
|
----
|
|
|