2017-02-07 9 views
1

У меня есть два класса, где первый класс ссылается на второй класс. Мой вопрос в том, почему во втором классе строка cl.container = this as ClassContainer<MyClass>; действительно работает, и явный листинг cl.container = (ClassContainer<MyClass>)this; этого не делает.Почему это вместо того, чтобы работать на литье?

class MyClass 
{ 
    public ClassContainer<MyClass> container { get; set; } 
} 

второй класс:

class ClassContainer<T> where T : MyClass 
{ 
    public ClassContainer() 
    { 
     MyClass cl = new MyClass(); 
     cl.container = this as ClassContainer<MyClass>; // works 
     cl.container = (ClassContainer<MyClass>)this; // does not work 
    } 
} 
+0

Когда вы говорите «не работает», это вызывает какие-либо ошибки? – prtdomingo

+1

@prtdomingo он не компилирует –

+0

@Kevin Wallis ищет ответ здесь: http://stackoverflow.com/questions/7504438/why-does-casting-give-cs0030-while-as-works –

ответ

1

Это потому, что as является безопасным литая, т.е. он не будет вызывать исключение или ошибку компилятора, если тип не может быть литыми. Он просто вернет null. c1.container должно быть null после использования as.

Из вашего кода вы можете использовать универсальные варианты. Проверьте this link at MSDN, чтобы помочь достичь того, что вы пытались сделать. Вы получите have to use interfaces though и не можете сделать параметр типа как ковариантным, так и контравариантным.

+0

cl.container не имеет значения null, управляющего его кодом –

+0

@MaksimSimkin попробуйте использовать класс, получающий 'MyClass' как тип параметр. 'c1.container' определенно будет null. – EvilTak