No. El compilador no cambia la construcción. ¿Qué tipo debe ser el argumento del constructor? ¿Cuerda? ;-)
Los literales de cadena son constantes sin nombre.
Además, puede inicializar cualquier clase con una cadena literal, si es compatible con un operador:
public class UnitTest1 {
class MyStringable {
public static implicit operator MyStringable(string value) {
return new MyStringable();
}
}
[TestMethod]
public void MyTestMethod() {
MyStringable foo = "abc";
}
}
Editar Para ser más claro: como lo pidió, si
cadena se ser convertido en cualquier llamada de constructor, echemos un vistazo al código IL.
tomado este método de prueba:
[TestClass]
class MyClass {
[TestMethod]
public void MyTest() {
string myString = "foo";
if (myString == "bar")
Console.WriteLine("w00t");
}
}
Crea el siguiente código IL:
.method public hidebysig instance void MyTest() cil managed
{
.custom instance void [Microsoft.VisualStudio.QualityTools.UnitTestFramework]Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute::.ctor()
.maxstack 2
.locals init (
[0] string myString,
[1] bool CS$4$0000)
L_0000: nop
L_0001: ldstr "foo"
L_0006: stloc.0
L_0007: ldloc.0
L_0008: ldstr "bar"
L_000d: call bool [mscorlib]System.String::op_Equality(string, string)
L_0012: ldc.i4.0
L_0013: ceq
L_0015: stloc.1
L_0016: ldloc.1
L_0017: brtrue.s L_0024
L_0019: ldstr "w00t"
L_001e: call void [mscorlib]System.Console::WriteLine(string)
L_0023: nop
L_0024: ret
}
Como se puede ver, todos los valores de cadena (foo, bar y w00t) siguen siendo las cadenas y no llaman cualquier constructor oculto.
Espero que esto sea más explicativo.
[Parcialmente correcta] (http://msdn.microsoft.com/en-us/library/system .string_members.aspx), pero las cadenas son un poco más complejas, y se almacenan en caché y se comparten de maneras extrañas. Buena suerte. – Kobi