1

以下は私のコードです。 DateTime が Object に変更できない理由がわかりません。この問題を解決するアイデアはありますか?

    public class Test
    {
        public DateTime CreatedTime { get; set; }
    }
    public class Test1
    {

    }
    public class Test2 : Test1
    {
    }
    static void Main(string[] args)
    {

        Func<Test, ArgumentException> fn1 = null;
        Func<Test, Exception> fn2 = fn1;// success 

        Func<Test, Test2> fn3 = null;
        Func<Test, Test1> fn4 = fn3;//success  

        Func<Test, DateTime> expression1 = p => p.CreatedTime;
        Func<Test, object> s = expression1; // Cannot implicitly convert type 'System.Func<IlReader.Program.Test,System.DateTime>' to 'System.Func<IlReader.Program.Test,object>'    
        Func<Test, ValueType> s2 = expression1; // cannot implicatily convert .... 
    }
4

2 に答える 2

6

DateTime値型です。値型から参照型への変換 (objectこの場合) は、表現を変更する変換です。値の型をボックス化する必要があります。参照型の場合、これは当てはまりません。CLR はポインターを使用して参照を実装し、すべてのポインターは同じサイズです。派生クラスへの参照は、単に基本クラスへの参照として解釈されます。このため、値型に対してそのような共分散を使用することはできません。

理論的には、コンパイラが次のような中間関数を生成することは可能でした。

object compilerGeneratedFunction(Test t) {
    return (object)anonymousFunctionThatReturnsDateTime(t);
    // The above cast can be implicit in C# but I made it explicit to demonstrate
    // boxing that has to be performed.
}

Func<Test, DateTime> convertedFunction = compilerGeneratedFunction;

しかし、結果のデリゲートは、C# 仕様のデリゲート等価規則に従わないなどの悪いことを引き起こす、まったく異なる関数を指すことになります。設計チームは、そのような関数を生成しないことを決定しました。

于 2010-10-12T03:41:25.767 に答える
0

フィールドではなく、デリゲートタイプFunc<Test, DateTime> expression1をデリゲートタイプに変換しようとしています。Func<Test, object>DateTimeobject

これが本来の意図である場合は、代わりに次のようにラムダ式の構文を使用してください。

Func<Test, object> s = p => p.CreatedTime;
于 2010-10-12T03:36:40.890 に答える