фона:
Давайте предположим, что у меня есть следующий класс:Почему это неявное преобразование типов в C# не удается?
class Wrapped<T> : IDisposable
{
public Wrapped(T obj) { /* ... */ }
public static implicit operator Wrapped<T>(T obj)
{
return new Wrapped<T>(obj);
}
public void Dispose() { /* ... */ }
}
Как вы можете видеть, это обеспечивает оператор неявного преобразования типа для T
→ Wrapped<T>
. В конце концов, я хотел бы иметь возможность использовать этот класс следующим образом:
interface IX { /* ... */ }
class X : IX { /* ... */ }
...
IX plainIX = new X();
using (Wrapped<IX> wrappedIX = plainIX)
{
/* ... */
}
Проблема:
Однако преобразование типов в приведенном выше пункте using
терпит неудачу. Хотя я могу назначить new X()
непосредственно на wrappedIX
, мне не разрешено присваивать ему что-либо типа IX
. Компилятор будет жаловаться на следующую ошибку:
Compiler error CS0266: Cannot implicitly convert type 'IX' to 'Wrapped<IX>'. An explicit onversion exists (are you missing a cast?)
Я не понимаю этого. В чем проблема?
может быть скомпилирован, если заменить «IX plainIX = новый X();» с "X plainIX = новый X();" – Nagg
@ Nagg: Из-за того, что я пытаюсь достичь (а именно, для создания свободного интерфейса поверх существующей библиотеки COM *), абсолютно необходимо программировать против интерфейсов. Поэтому, к сожалению, ваше предложение не является жизнеспособным вариантом. – stakx