2011-01-31 21 views
13

¿Hay alguna manera de hacerlo, ya que parece que el método parcial debe volverse vacío (realmente no entiendo esta limitación, pero déjela ser)?¿Cómo devolver el valor del método parcial de C#?

+2

+1 porque ni siquiera sabía que * había * métodos parciales. –

+1

Es el principio "cuando un árbol cae en el bosque, ¿es un sonido?". Eso es expresable en C#, el sonido que hace es * void *. –

+0

vea también http://stackoverflow.com/questions/6954572/why-cant-partial-methods-return- anything –

Respuesta

9

Bueno, técnicamente puede "retorno" un valor de un método parcial, pero tiene que ser a través de un argumento ref, por lo que es bastante incómodo:

partial void Foo(ref int result); 

partial void Foo(ref int result) 
{ 
    result = 42; 
} 

public void Test() 
{ 
    int i = 0; 
    Foo(ref i); 
    // 'i' is 42. 
} 

En ese ejemplo, el valor de i no cambiará si Foo() no está implementado.

+0

Puro feo, pero +1 para el ejemplo. –

8

De MSDN:

  • declaraciones de métodos parciales deben comenzar con la palabra clave contextual parcial y el método debe devolver vacío.

  • Los métodos parciales pueden tener parámetros de referencia pero no de salida.

Así que la respuesta es no, no se puede.

Quizás si explica un poco más sobre su situación (por qué necesita devolver un valor, por qué la clase es parcial), podemos proporcionar una solución alternativa.

5

No se puede devolver un valor de un método parcial.

Los métodos parciales pueden o no implementarse. Si se le permitiera devolver un valor de dicho método, ¿qué recibiría la persona que llama?

4

La razón de la restricción es esta línea de MSDN:

una clase parcial o struct pueden contener un método parcial. Una parte de la clase contiene la firma del método . Se puede definir una implementación opcional en la misma parte u otra parte . Si la implementación no es suministrada, entonces el método y todas las llamadas al método se eliminan al tiempo de compilación. - Énfasis Mina

Si el método no se puede implementar y se puede quitar. ¿Qué pasaría con su valor de retorno si se elimina la llamada?

En cuanto a su pregunta de una solución alternativa, eso depende de lo que intente hacer, pero obviamente no puede usar un método parcial.

1

Oh. Una vez tuve que hacer esto en un proyecto mío. Puede lanzar una excepción en su método llamado ReturnValueException que defina como una excepción que tenga una propiedad de objeto denominada ReturnedValue. Ahora puede llamar a su método Foo() dentro de un bloque try y recopilar los resultados en el bloque catch.

No .. es una broma.

No hagas eso. Nunca.

Cuestiones relacionadas