簡體   English   中英

C#通用協變錯誤

[英]C# Generic Covariant Error

以下是我的代碼,我不知道為什么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 .... 
    }

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#規范中的委托相等規則。 設計團隊已決定不生成此類功能。

您正在嘗試將委托類型Func<Test, DateTime> expression1轉換為委托類型Func<Test, object> ,而不是將DateTime字段轉換為object

如果這是您的初衷,請改用lambda表達式語法,如下所示:

Func<Test, object> s = p => p.CreatedTime;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM