Por distintas consideraciones en el Stand de Plain Concepts del Tech Days 2008 no pudimos hacer un concurso que teníamos pensado pero ahora aprovechamos para ponerlas en Geeks.
Por supuesto sin compilar:
1º Pregunta:
¿Cuál es el resultado del siguiente fragmento de código?
class Program
{
public const string APP_ID = new string(‘a’,2);
static void Main(string[] args)
{
int total = default(Int32);
int result = (from i in Enumerable.Range(1, 10)
where (i & 1) == 1
select i
).Sum();
Console.WriteLine(«El resultado es {0}»,result);
}
}
Respuestas:
- 20
- 25
- Este código no compila
2º Pregunta:
¿Cuál es el resultado del siguiente fragmento de código?
class Program
{
static void Main(string[] args)
{
List<int> set = new List<int>();
for(int i = 0; i<10; i++)
set.Add(i);
DoSomething(set);
Console.ReadLine();
}
public static void DoSomething<T>(IList<T> set)
{
Console.WriteLine(«DoSomething<T>(IList<T> set)»);
}
public static void DoSomething<T>(params T[] items)
{
Console.WriteLine(«DoSomething<T>(params T[] items)»);
}
public static void DoSomething<T>(T item1, params T[] items)
{
Console.WriteLine(«DoSomething<T>(T item1,params T[] items)»);
}
public static void DoSomething<T>(T item1, T item2)
{
Console.WriteLine(«DoSomething<T>(T item1, T item2)»);
}
}
Respuestas:
- DoSomething<T>(IList<T> set)
- DoSomething<T>(params T[] items)
- DoSomething<T>(T item1,params T[] items)
- DoSomething<T>(T item1, T item2)
3º Pregunta:
¿Cuál es el resultado del siguiente fragmento de código?
class Program
{
class Customer
{
public string Name { get; set; }
}
static void Main(string[] args)
{
Customer initCustomer = new Customer();
Customer otherCustomer = SetCustomer(ref initCustomer);
Console.WriteLine(Object.ReferenceEquals(initCustomer, otherCustomer));
Console.WriteLine(Object.ReferenceEquals(initCustomer, SetCustomer(ref initCustomer)));
Console.Read();
}
static Customer SetCustomer(ref Customer c)
{
c = new Customer();
return c;
}
}
Respuestas:
- True True
- False False
- True False
- False True
4º Pregunta:
¿Cuál es el resultado del siguiente fragmento de código?
class Program
{
static void Main(string[] args)
{
string cadenaUno = «Plain Concepts S.L»;
string cadenaDos = «Plain Concepts S.L»;
Console.WriteLine(Object.ReferenceEquals(cadenaUno,«Plain Concepts S.L»));
Console.WriteLine(Object.ReferenceEquals(cadenaUno, cadenaDos));
Console.ReadLine();
}
}
Respuestas:
- True True
- False False
- True False
- False True
[EDITADO]
P.D: Por cierto desde aquí las gracias a Octavio y Yamil que colaboraron activamente en el «pensamiento» 🙂 de las preguntas
Hola Unai,
1. 3
2. 3
3. 3
4. 1
Salduos.
Ha sido divertido.
Saludos,
Emilio… he dicho que no valía compilar !!! Estás fuera de la media.. no se si por que eres un máquina o por otra cosa 🙂
Creo que voy a estudiar un rato 🙁
No soy una máquina lo que pasa es que era muy tarde y no vi que no valía compilador, lo siento.
¿Todavía no entiendo la 2, alguien se ofrece a explicarla?
Cuando haya más preguntas prometo dar una explicación a todas..
Jaja, bueno, después de la demostración de copy-paste-run podemos hacer ingeniería inversa 🙂
Bueno, ya que me he picado y me estoy tomando un café…
1. No compila porque el extension method .Sum( ) devuelve un double y se intenta asignar implícitamente en un int.
2. Por inferencia de tipos de parámetros, como al método genérico no le pasamos el argumento de tipo lo infiere del parámetro que pasamos, el param array es opcional, así que entra por ahí. ( Me explico como un libro cerrado, y más en castellano con estos términos )
3. Aquí habría fallado, cuanta cantidad de detallitos 🙂 .La diferencia entre pasar por referencia Customer es que puedes modificar la referencia en sí misma, sin ese ref los cambios en el Customer se verían pero no la modificación de la referencia.
Mi perdición ha sido que cuando se hace la segunda comparación. Los parámetros entran en la pila por órden por lo que no son iguales, para demostrarlo cambiamos el órden y ponemos antes la llamada a la función.
4. La 1, son la misma referencia porque estarán Interned . Que alguien me explique el método String.IsInterned( string s ) y porque no devuelve un bool 🙂
PingBack desde dvilchez.net » Blog Archive » Concurso de Plain Concepts
Pablo Alarcon..
La primera está mal… no compila por otra cosa más obvia
En la primera se asigna a una constante un valor de instancia
Ok, APP_ID al ser const puedes asignarle un literal constante, pero no una instancia de un string, debería ser static readonly . Curioso en el caso de los strings.
Pero vamos, la asignación de double Sum( ) en un int también es un error de compilación, así que reclamo medio minipunto 🙂
Pablo Alarcon:
Lo siento pero no hay medio puntito
IEnumerable.Sum() devuelve en una de sus sobrecargas int por lo que eso si compila Palo.
1. Creo recordar que no se puede hacer una asignación a const cuando el valor no es otro constante, una de las diferencias con readonly (una, no todas)
El resto…ya lo miraré.