[英]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-inference/
我以前的Microsoft博客:
https://blogs.msdn.microsoft.com/ericlippert/tag/type-inference/
特別要看
https://blogs.msdn.microsoft.com/ericlippert/2009/12/10/constraints-are-not-part-of-the-signature/
該博客的評論非常有趣。 如果您曾經想像一百個人一樣告訴我我錯了,設計錯了,實現錯了,那就是去的地方。
它不能用來推斷類型。 您已經說過T
必須是Parent
的類型,但是由於您沒有傳遞該類型的參數(編譯器可以用來推斷該類型),因此您必須明確命名該類型。
編譯器沒有可推斷的信息-您需要一個參數或其他信息來告訴編譯器推斷T
。
我不是這方面的專家,但我認為沒有什么可以推斷的 。
在Parent
派生中聲明此方法的簡單事實與此無關。
您需要為該方法使用類型T
的參數,以便編譯器可以從中推斷出應該用作T
。
在您的通話中, T
不必是Parent
或Child
。 只要它是從Parent
繼承的,它就可以是任何東西 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.