2014-11-20 2 views
2

Мой пример кода:по умолчанию (T) возвращает нуль, где T наследует DataContext

public class GenericClass<T> : IDisposable where T: System.Data.Linq.DataContext 
{ 
    public T context{ get; private set; }  

    public GenericClass() 
    { 
     this.context= default(T); // default(T) return null 
     // code 
    }  

    public void Dispose() 
    { 
     context.Dispose(); 
    } 
} 

Используя образец кода GenericClasss:

using (GenericClasss <DataAccessDataContext> dataAccess = new GenericClasss <DataAccessDataContext>()) 
{ 
    //code 
} 

где DataAccessDataContext является .dbml (наследует System.Data. Linq.DataContext) и имеет конструктор по умолчанию

Извините, если это что-то простое, и я не замечаю. Большое спасибо.

+7

, что вы ожидали? –

+3

Это то, что должен делать 'default'. Чего вы ожидали или пытались достичь? – Rik

+2

Каков ваш вопрос/проблема? –

ответ

5

Если вы wan't, чтобы быть в состоянии создать новый объект от общего типа, вы должны использовать ключевое слово new():

public class GenericClass<T> : IDisposable where T: System.Data.Linq.DataContext, new() 

И позвони new T() внутри конструктора:

public GenericClass() 
{ 
    this.context = new T(); 
} 

Компилятор должен знать, что у T есть конструктор по умолчанию.

+0

Это то, что мне было нужно, большое спасибо. – Nacho

+0

Если вам нужно вызвать конструктор не по умолчанию (например, один с параметром строки подключения), вы можете использовать Activator.CreateInstance, так как ограничение generic() вообще применяется только к конструктору без параметров без параметров. – Dismissile

+0

Да, или вы могли бы использовать другой подход, если вам нужна более высокая производительность: http://vagifabilov.wordpress.com/2010/04/02/dont-use-activator-createinstance-or-constructorinfo-invoke-use-compiled- лямбда-выражения/ –

6

Это ожидаемое поведение для значения по умолчанию ссылочного типа, default(T), где T является ссылочным типом: null.

+0

извините за мое замешательство, большое спасибо – Nacho

+0

@Нако вас приветствует чувак! Без проблем. – Christos

+0

большое спасибо – Nacho

0

Если вы пытаетесь создавать новый контекст, вы можете сделать это:

public GenericClass() 
{ 
    this.context = new T(); 
} 
Смежные вопросы