Follow-up di Il mio utilizzo dell'operatore di casting esplicito è ragionevole o un brutto attacco?
Uno degli utenti che ha commentato quella domanda ha detto che è davvero brutto se l'operatore di casting crea un nuovo oggetto sotto il cofano, poiché cessa di essere un cast reale. È ovviamente un punto molto valido.
Quando si userebbe la capacità di definire la conversione del tipo personalizzato? In particolare: tra due tipi che non sono correlati per ereditarietà in alcun modo.
Con gli oggetti correlati rende (alcuni) senso:
class Animal {
public string Name {get;set;}
public int Age {get;set;}
}
class Dog : Animal {
public void Bark(){}
public void Fetch(){}
}
class Cat : Animal {
public void Meow(){}
public void Sleep(){}
}
Anche se normalmente la conversione di Cat
in Dog
non sarebbe possibile, ha senso autorizzarla esplicitamente - condividono tutti i loro dati, solo il comportamento è diverso.
Anche quando ci sarebbe qualche differenza nei campi:
class Parrot : Animal {
public int WingSpan {get;set;}
public void Screech(){}
}
il casting potrebbe ancora essere desiderato (% da% di% a% di% di latitudine per esempio, poiché Parrot
non ha più dati di Cat
).
Ma per quanto riguarda due tipi non correlati? È possibile fare:
class Rock{
public int Age {get;set;}
}
e
public static explicit operator Rock(Cat cat){
return new Rock{Age = cat.Age};
}
ma perché? Come indicato nella domanda correlata, causerebbe un comportamento abbastanza strano:
var cat = new Cat{Name = "Fluffy", Age = 8};
var rock = (Rock) cat;
rock.Age = 100000000;
Console.WriteLine(rock.Age); // 100000000
Console.WriteLine(cat.Age); // 8
Qualcuno può dare un buon esempio di quando implementare un operatore esplicito tra tipi non correlati ha senso e come farlo?