1

IValueConverterbool をオブジェクトに変換するを作成しましたSystem.Windows.Visibility( の反対を行いますBooleanToVisibilityConverter)。オブジェクトで使用しようとする場合を除いて、正常に動作しObservable<bool>ます。 Observable<T>は、T に変換する暗黙の演算子を使用して定義したクラスです。問題は、bool としてボックス化解除すると、InvalidCastException.

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    if ((bool)value) // InvalidCastException
    {
        return Visibility.Hidden;
    }
    else
    {
        return Visibility.Visible;
    }
}

Observableが としてボックス化されている場合、C# は暗黙の演算子を無視しているようObjectです。例えば:

Observable<bool> obs = new SimpleObservable<bool>(true);
object obj = obs;

// This conversion works just fine:
bool bval = (bool)(Observable<bool>)obj;

// This conversion throws an InvalidCastException:
bval = (bool)obj;

Observable<bool>bool としてボックス化解除できることを保証する方法はありますか?

4

1 に答える 1

3

Observable が bool としてアンボックスできることを保証する方法はありますか?

いいえ。このコードは を彷彿とさせNullable、タスクを達成するためにコンパイラから直接サポートを受けました。

問題はimplicit、実行時に真の暗黙的な変換を作成しないことです。これは純粋にコンパイル時のシンタックス シュガーです。Xコンパイラは、型の式を、型を期待する変数に入れようとしていることに気付くと、コンパイル時にandYの定義を調べて、暗黙的な変換演算子を探し、見つかった場合は、適切な静的メソッド呼び出しを入れます。変換を行う場所で。実行時までには、暗黙的 (または明示的) な変換演算子に関する知識は残っていません。残っているのは、プリミティブ型間や型階層内の型間など、言語に焼き付けられたいくつかの部分だけです。XY

于 2013-01-14T21:47:02.360 に答える