2012-01-25 12 views
11

Nunca uso la Restricción nueva porque el uso no es claro para mí. Aquí encontré una muestra, pero simplemente no entiendo el uso. Aquí está el códigocon respecto al uso de la nueva Restricción en C#

class ItemFactory<T> where T : new() 
{ 
    public T GetNewItem() 
    { 
     return new T(); 
    } 
} 

public class ItemFactory2<T> where T : IComparable, new() 

{ 
} 

por lo que cualquiera favor hacerme entender el uso de la nueva restricción con una pequeña muestra de & fácil para su uso en el mundo real. gracias

Respuesta

6

Además de Darin's answer, algo como esto podría fallar porque Bar no tiene un constructor sin parámetros

class ItemFactory<T> where T : new() 
    { 
     public T GetNewItem() 
     { 
     return new T(); 
     } 
    } 

    class Foo : ItemFactory<Bar> 
    { 

    } 

    class Bar 
    { 
     public Bar(int a) 
     { 

     } 
    } 

error real es: 'Bar' must be a non-abstract type with a public parameterless constructor in order to use it as parameter 'T' in the generic type or method 'ItemFactory<T>'

La siguiente también fallará:

class ItemFactory<T> 
{ 
    public T GetNewItem() 
    { 
     return new T(); 
    } 
} 

El error real es: Cannot create an instance of the variable type 'T' because it does not have the new() constraint

+0

solo necesito saber que ... nuevo() siempre se usará para el parámetro menos constructor. si constructor toma el parámetro, entonces no podemos usar sintaxis como donde T: new()? por favor discutelo. Gracias – Thomas

11

Esta restricción requiere que el tipo genérico que se utiliza no sea abstracto y que tenga un constructor predeterminado (sin parámetros) que le permita invocarlo.

Ejemplo de trabajo:

class ItemFactory<T> where T : new() 
{ 
    public T GetNewItem() 
    { 
     return new T(); 
    } 
} 

que obviamente ahora le obligará a tener un constructor sin parámetros para el tipo que se pasa como argumento genérico:

var factory1 = new ItemFactory<Guid>(); // OK 
var factory2 = new ItemFactory<FileInfo>(); // doesn't compile because FileInfo doesn't have a default constructor 
var factory3 = new ItemFactory<Stream>(); // doesn't compile because Stream is an abstract class 

inhábiles ejemplo:

class ItemFactory<T> 
{ 
    public T GetNewItem() 
    { 
     return new T(); // error here => you cannot call the constructor because you don't know if T possess such constructor 
    } 
} 
+0

El ctor predeterminado está vacío ctor;) – Novakov

+3

@Novakov: No es correcto. El ctor predeterminado es un ctor sin parámetros. Pero su cuerpo no necesita estar vacío, muy bien puede contener código. –

+0

@Daniel: Siempre pensé que el compilador genera ctor predeterminado si no se define ctor y 'predeterminado' significa que tiene el comportamiento predeterminado (call base class ctor). – Novakov

0

La nueva restricción específica es que cualquier argumento de tipo en una declaración de clase genérica debe tener un constructor público sin parámetros.

citado del oficial website

-1

Puede leer new() como si se trata de una interfaz con un constructor. Así como IComparable especifica que el tipo T tiene un método CompareTo, la nueva restricción especifica que el tipo T tiene un constructor público.

0

En su ejemplo, la restricción actúa en <T> en la declaración de clase. En el primer caso, requiere que el objeto genérico T tenga un constructor predeterminado (sin parámetros). En el segundo ejemplo, requiere que T tenga un constructor predeterminado sin parámetros y que debe implementar la interfaz IComparable.

Cuestiones relacionadas