¿Puede un parámetro de tipo covariante estar en una position de input en el constructor?

En esta respuesta , Michael sugiere que el parámetro de tipo genérico se haga co-variante para permitir la creación de un nodo vacío.

Obtengo que el parámetro de tipo genérico está en todas las posiciones de salida, ya que todas las properties del Tree<T> y sus subtypes son de solo lectura ( val 's).

Pero tiene el parámetro tipo en una position de input en el constructor.

Pensé que ese código no funcionaría en C #, así que lo probé y, para mi sorpresa, funcionó bien.

 // See this: https://stackoverflow.com/questions/36753579/algebraic-data-types-in-kotlin // Short url: https://stackoverflow.com/a/36753782/303685 interface ITree<out T> { } class Tree<T>: ITree<T> { } sealed class Node<T> : Tree<T> { private readonly T _left; private readonly T _right; public Node(T left, T right) { _left = left; _right = right; } public T Left { get { return _left; } } public T Right { get { return _right; } } } class Program { static void CovarianceTest1() { ITree<object> tree = new Node<string>("Hello", "World!"); } } 

Ahora me doy count de que al hacer este ejercicio, aprendí algo nuevo sobre la varianza.

Entonces, mi primera pregunta es:

¿Se permiten los parameters del tipo de covariante en las posiciones de input en los constructores? ¿En qué otros lugares se permiten los parameters de tipo para ignorar sus calificadores de varianza?

Otra cosa que aprendí sobre la varianza es que el parámetro de tipo genérico variante puede que ni siquiera aparezca en la statement de interfaz de variante como se ve en el siguiente ejemplo.

 interface ITree<out T> { } 

Verá que la ITree<out T> no tiene T en las posiciones de input o salida. Esto también fue un shock para mí.

Mi segunda pregunta es:

Y la otra pregunta que tengo es, ¿cuál es el equivalente C # del tipo Nothing en Kotlin? La respuesta dice que Nothing es el subtipo más que no se puede derivar. Es exactamente lo contrario de Any (o el tipo más básico en otros idiomas).

Para emular ese código en C #, no tiene sentido tener esto:

 class Empty : Tree<null> { } 

Porque eso es solo código C # ilegal y null tampoco parece análogo a Nothing .

Entonces, tuve que falsificar un maniquí como para imitar la statement de class Empty .

 sealed class Dummy { } sealed class Empty : Tree<Dummy> { private static Empty _empty = null; private static object syncLock = new object(); private Empty() { } public Empty Instance { get { if (_empty == null) { lock (syncLock) { if (_empty == null) { _empty = new Empty(); } } } return _empty; } } } 

Mi tercera y última pregunta es:

Por lo tanto, mi última pregunta es, ¿hay algún lugar que contenga una list exhaustiva de todos los types disponibles en Kotlin junto con sus descripciones? Porque aunque la página Tipos básicos enumera la mayoría de los comunes, parece que no es una list exhaustiva. Los types que no figuran en la list están todos salpicados sobre la documentation . Al igual que en la instancia anterior, solo aparecen con una mención en una página aquí o allí.