Estoy agregando esto para arrojar esperanzadamente un poco más luz en las respuestas ofrecidas por Jon y Marc.
consideran este método no genérico:
public static void SetToNull(ref ISomeInterface obj) {
obj = null;
}
Hmm ... establecer un parámetro ref
en nulo. Eso es solo posible para un tipo de referencia, ¿correcto? (Bueno, o para un Nullable<T>
; pero ignoremos ese caso para mantener las cosas simples). Por lo tanto, el hecho de que este método se compile nos dice que una variable declarada como de algún tipo de interfaz debe tratarse como un tipo de referencia.
La frase clave aquí es "declarado": considerar este intento de llamar al método anterior:
var x = new SomeStruct();
// This line does not compile:
// "Cannot convert from ref SomeStruct to ref ISomeInterface" --
// since x is declared to be of type SomeStruct, it cannot be passed
// to a method that wants a parameter of type ref ISomeInterface.
SetToNull(ref x);
Por supuesto, la razón por la que no se puede pasar x
en el código anterior para SetToNull
es que haría x
debe declararse como ISomeInterface
para que pueda pasar ref x
- y no porque el compilador sabe mágicamente que SetToNull
incluye la línea obj = null
. Pero de una manera que sólo refuerza mi punto: la línea obj = null
es legal precisamente porque sería ilegal pasar una variable no declarado como un ISomeInterface
al método.
En otras palabras, si una variable se declara como ISomeInterface
, se puede establecer como nula, pura y simple. Y eso se debe a que las interfaces son tipos de referencia; por lo tanto, declarar un objeto como una interfaz y asignarlo a un objeto de tipo de valor cuadra ese valor.
Ahora, por el contrario, consideran que este método genérico hipotético:
// This method does not compile:
// "Cannot convert null to type parameter 'T' because it could be
// a non-nullable value type. Consider using 'default(T)' instead." --
// since this method could take a variable declared as, e.g., a SomeStruct,
// the compiler cannot assume a null assignment is legal.
public static void SetToNull<T>(ref T obj) where T : ISomeInterface {
obj = null;
}
que supone que. No estoy del todo seguro de qué fue lo que me hizo dudar de que ese sería el caso. Solo pensé en tirarlo aquí por si acaso alguien más se preguntaba algo. – Sekhat
Dale a un hombre una herramienta para obtener respuestas (Red Gate Reflector), y él tendrá respuestas de por vida. Pero dale solo una respuesta y él volverá con más preguntas y más puntos de recomendación SO ... –
@Ben: Por otro lado, dale a un hombre una herramienta y ellos tendrán que verificarlo cada vez que lo hagan '. no estoy seguro Dale a un hombre una * explicación * y ellos podrán razonar sobre esto por sí mismos. –