2016-10-05 2 views
2

У меня есть собственный класс с именем Необязательный < T>. Этот класс переопределяет оператор неявного, что-то вроде этого:Вложенный неявный оператор

public static implicit operator Optional<T>(T value) 
{ 
    return new Optional<T>(value); 
} 

public static implicit operator T(Optional<T> value) 
{ 
    return value.value; 
} 

Ok, до сих пор все в порядке, прямые операции, как эти работы:

Optional<int> val = 33; //ok 
int iVal = val; //ok 

Но это не работает:

Optional<Optional<int>> val = 33; //error, cannot convert implicitly 

Так что мне интересно, как можно поддержать предыдущий случай.

Cheers.

ответ

2

Вы не можете связать пользовательские неявные операторы. Если вы определяете неявное преобразование из A в B и от B до C, не происходит никакого неявного преобразования из A в C, которое вызывает оба. Вам нужно либо создать отдельное пользовательское преобразование от A до C, либо иметь явное преобразование, чтобы сделать половину конверсии для вас.

+0

Можете ли вы добавить пример использования явного оператора для помощи в этом случае? Благодарю. – Gusman

+0

@ Gusman Если есть неявное преобразование из A в B и из B в C, вы можете написать 'C c = (B) a;', так как это заканчивается только одним неявным пользовательским преобразованием. – Servy

+0

Хорошо, я понимаю, я думал, что вы хотите переопределить явный оператор. Благодарю. – Gusman