10

いくつかの基本型から派生した辞書に関数のファミリを保持したいと思います(たとえば、基本クラスを「オブジェクト」と呼びましょう)。では、f1 を f2 に保持することは可能ですか?

Func<bool> f1 = () => true;
Func<object> f2 = f1;

エラー 1 型System.Func<bool>を暗黙的に変換できませんSystem.Func<object>

これが私たちにできる最善のことですか?

Func<bool> f1 = () => true;
Func<object> f2 = () => (object)f1;

エラー: (なし)

ジェネリックフレンドリーにする必要があるのはwhereステートメントだと思います...しかし、ラムダでそれができるかどうかはわかりません。


Armen の情報をフォローアップして、string と bool の定義を掘り下げました。

public sealed class String : IComparable, ICloneable, IConvertible, IEnumerable,
                             IComparable<String>, IEnumerabl<char>,
                             IEquatable<String> 

public struct Boolean : IComparable, IConvertible, IComparable<Boolean>,
                        IEquatable<Boolean>

彼は ref Vs 値について正しいです。String はオブジェクトから暗黙的に派生しますか? @PeterKのリンクによると、構造体の動作のようです。

「ValueType は、値の型のより適切な実装で Object の仮想メソッドをオーバーライドします。ValueType から継承する Enum も参照してください。」

物体:

System.Object: すべてのクラス、構造体、列挙型、およびデリゲート。( http://msdn.microsoft.com/en-us/library/system.objectから)

Func<bool>そのため、割り当てられないことはFunc<object>少しばかげています。つまり、継承階層はその観点からは正しかったのです。

4

2 に答える 2

3

.NET 4.0以降を使用している場合、これは可能です。

boolは値型であるため、この例は機能しません。ただし、boolを文字列で変更する場合は、サンプルが機能します。

    Func<string> f1 = () => "true";
    Func<object> f2 = f1;
于 2012-09-08T11:07:39.827 に答える
3

ここから(私の強調):

共分散により、ジェネリック パラメーターで指定されたものよりも派生した型を使用できます。これにより、バリアント インターフェイスを実装するクラスの暗黙的な変換とデリゲート型の暗黙的な変換が可能になります。参照型では共変性と反変性がサポートされていますが、値型ではサポートされていません

また

差異は参照型にのみ適用されます。バリアント型パラメーターに値の型を指定すると、その型パラメーターは結果として構築される型に対して不変になります。

その理由は、C# と CLI が歴史的に値型の配列共分散をどのように処理しているか (そして一致していないか) に関係している可能性があります。いくつかの情報については、こちらをご覧ください。

ご覧のとおり、型パラメーターの共分散はFunc<out TResult>値型では機能しないため、次のようにする必要があります。

Func<object> f2 = () => f1();
于 2012-09-08T15:07:00.147 に答える