2010-08-11 28 views
14

me ha dado una declaración de la muestra:pregunta de la entrevista en C# conversión implícita

MyClass myclass = 3; 

¿Cómo es posible hacer de esto una declaración válida? ¿Qué código debo incluir en MyClass para admitir la conversión implícita de int?

+0

Esto en realidad es una buena pregunta, necesita editar aunque –

+0

¿Cómo se relaciona esto con el tipado implícito? probablemente se refiera a la conversión implícita –

+0

sí, la conversión implícita es mejor decir aquí – Mike

Respuesta

19

Hace falta un programa implicit conversion operator:

public class MyClass 
{ 
    private readonly int value; 
    public MyClass(int value) 
    { 
     this.value = value; 
    } 

    public static implicit operator MyClass(int value) 
    { 
     return new MyClass(value); 
    } 
} 

Personalmente no soy un gran fan de las conversiones implícitas mayor parte del tiempo. De vez en cuando son útiles, pero piense detenidamente antes de ponerlos en su código. Pueden ser bastante confusos cuando estás leyendo código.

Por otra parte, cuando se utiliza de manera reflexiva, que puede ser increíblemente útil - Estoy pensando sobre todo en las conversiones string-XName y XNamespace en LINQ to XML.

+0

Son confusos para las clases por suresies. Sin embargo, cuando se usa de forma consistente con estructuras inmutables, de hecho no es confuso, pero es muy poderoso. 'FeetAndInches length =" 10 \ '- 3/16 \ "" 'es bastante obvio y no deja lugar a dudas sobre cómo funciona. –

+1

@Michael: en realidad sí. ¿Qué ocurre si la cadena de entrada es nula? ¿O vacío? ¿O contiene basura? En cada caso, ¿arroja o devuelve un valor sin sentido? Estas respuestas no son obvias para cualquiera que lea el código, por lo que probablemente no debería usar un operador implícito allí. (Por supuesto, una el operador implícito yendo por el camino opuesto sería diferente, pero entonces ya existe 'ToString()' para eso) – Timwi

+0

@Timwi Creo que hay espacio para la consistencia por convención. Me gusta asegurarme de que todas mis estructuras tengan un estado no inicializado ' var feetAndInches = FeetAndInches.Empty'.Este es también el valor predeterminado. No puede asignar null a una estructura, por lo que no es un problema. Si asigna una variable de cadena nula o cadena de otro modo no dispersable, ejecute una excepción de análisis. Si haces esto constantemente, no debería haber confusión, y tu código se vuelve mucho más legible. –

0

Es posible si MyClass tiene una conversión implícita de int.

Using Conversion Operators

+1

¿Quiere decir "una conversión implícita * de *' int' ", ¿verdad? – sepp2k

+0

@ sepp2k, a la derecha. –

-1

Necesitas sobrecargar el operador constructor implícito:

public static implicit operator MyClass (int rhs) 
{ 
    MyClass c = new MyClass (rhs); 
    return c; 
} 
6

Así es como:

public class MyClass 
{ 
    public static implicit operator MyClass(int i) 
    { 
     return new MyClass(i); 
    } 
} 

Este utiliza C# característica llamada implicit conversion operator.

0

Simplemente implemente un operador de conversión implicit.