簡體   English   中英

為什么不自動推斷?

[英]Why isn't this inferred automatically?

到目前為止,C#推理對我一直很有效。 我創建了一個測試示例以簡化此情況。

class Parent
{
    public void InferrenceTesting<T>() where T : Parent
    {

    }
}

class Child : Parent
{
    public void Test()
    {
        //this line gives me a compiler error : The type arguments for method 'Parent.InferrenceTesting<T>()' cannot be inferred from the usage. Try specifying the type arguments explicitly.
        this.InferrenceTesting();
    }
}

我已經閱讀了很多關於自卑的文章,但是對於為什么這樣不起作用我一無所知。

泛型方法類型參數的方法類型參數推斷通過基於正式參數形式參數之間的關系進行推斷。

您的方法具有零個形式參數和零個形式參數,因此不會進行推論。

請注意,尤其不要從通用參數約束中進行推斷 約束不是方法簽名的一部分,推斷本身與簽名有關。 而是類型推斷成功之后檢查約束。 如果您希望從where子句進行某種推斷,那么您的期望是錯誤的。

我已經讀了很多有關推論的文章,​​但是對於為什么這行不通我一無所知。

如果您對此主題感興趣,那么您可能希望閱讀我的有關類型推斷的博客文章。 它們可能比您閱讀過的其他一些文章更准確。 我偶爾會看到錯誤的信息。 從我當前的博客中:

https://ericlippert.com/category/csharp/type-in​​ference/

我以前的Microsoft博客:

https://blogs.msdn.microsoft.com/ericlippert/tag/type-in​​ference/

特別要看

https://blogs.msdn.microsoft.com/ericlippert/2009/12/10/constraints-are-not-part-of-the-signature/

該博客的評論非常有趣。 如果您曾經想像一百個人一樣告訴我我錯了,設計錯了,實現錯了,那就是去的地方。

它不能用來推斷類型。 您已經說過T必須是Parent的類型,但是由於您沒有傳遞該類型的參數(編譯器可以用來推斷該類型),因此您必須明確命名該類型。

編譯器沒有可推斷的信息-您需要一個參數或其他信息來告訴編譯器推斷T

我不是這方面的專家,但我認為沒有什么可以推斷

Parent派生中聲明此方法的簡單事實與此無關。

您需要為該方法使用類型T的參數,以便編譯器可以從中推斷出應該用作T

在您的通話中, T 不必ParentChild 只要它是從Parent繼承的,它就可以是任何東西

暫無
暫無

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

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