Perché C # non può convertire implicitamente in stringa?

6

C # consente conversioni implicite di numeri interi alle stringhe quando usate in un'espressione. Ad esempio, questo è completamente valido:

int myInt = 10;
string concatenatedString = "myInt is " + myInt;
string interpolatedString = $"myInt is {myInt}";

Tuttavia, quando int non viene concatenato o interpolato, C # richiede una conversione esplicita.

int myInt = 10;
string myString = myInt; 
// compiler error "Cannot implicitly convert type 'int' to 'string'"

Ovviamente questo non è un grosso problema: un semplice .ToString() si prende cura di questo semplicemente bene. Ma se .NET sa che ogni possibile int è anche una stringa valida, perché richiede ancora una conversione esplicita? Mi piacerebbe sapere cosa sta succedendo nella "mente" del compilatore.

    
posta Jacob Stamm 12.10.2016 - 14:14
fonte

3 risposte

14

In entrambi i casi, la lingua offre funzioni di zucchero sintattico, piuttosto che cast implicito:

var s = "1" + 1;

viene convertito nel metodo string Concat(object, object) durante la compilazione :

var s = String.Concat("1", 1);

E nel secondo caso,

var i = 1;
var s = $"1={i}";

viene convertito in string Format(string, object) (o equivalente) durante la compilazione:

var s = string.Format("1={0}", i);

Quindi, in entrambi i casi, int viene inserito in un object e ogni metodo chiama .ToString() su quell'oggetto. Non è richiesto alcun casting implicito.

Per quanto riguarda la domanda nel titolo: "Perché C # non può convertire implicitamente int a stringa?", la risposta è che né la String class, né la Int32 struct implementano implicit operator quindi non sono possibili conversioni implicite tra questi tipi. Potresti essere interessato a sapere se quel post C # 7, una caratteristica considerata per la lingua è chiamata " Estensione di tutto ". Ciò ti consentirebbe di aggiungere conversioni implicite tra vari tipi e stringhe alla lingua, in modo tale da poter fare qualcosa del tipo:

string s = 1;

se lo volevi davvero. Ovviamente, questo solleva la domanda, vorresti?

    
risposta data 12.10.2016 - 14:25
fonte
0

Esistono due casi di utilizzo comuni per la conversione "fuori dal contesto" di un intero in una stringa:

int myInt = 10;
string myString = myInt;

Il primo scenario crea una stringa di un solo carattere contenente solo un line-feed:

  • Fai finta che il numero decimale 10 sia un carattere.
  • Crea una stringa contenente solo quel carattere.

Il secondo scenario crea una stringa di due caratteri contenente la cifra "1" e la cifra "0":

  • Esegue una conversione da intero a secco del numero intero 10.
  • Inserisci il risultato nella nuova stringa.

Se C # avesse implementato una di queste alternative, è probabile che molti programmatori avessero scritto bug sottili perché (erroneamente) presumevano che l'altra alternativa avrebbe funzionato.

    
risposta data 18.06.2017 - 21:38
fonte
-2

Può essere dovuto al fatto che int (alias della struttura Int32) è di tipo value e string (alias of String Class) è un tipo di riferimento. Quindi, il compilatore non può essere convertito a meno che tu non chiami esplicitamente

myInt.ToString()

    
risposta data 17.10.2016 - 07:35
fonte

Leggi altre domande sui tag