C# 为什么不是';这不是自动推断出来的吗?
到目前为止,C#reference一直对我很有效。我创建了一个测试示例来简化这个案例C# 为什么不是';这不是自动推断出来的吗?,c#,generics,inferred-type,C#,Generics,Inferred Type,到目前为止,C#reference一直对我很有效。我创建了一个测试示例来简化这个案例 class Parent { public void InferrenceTesting<T>() where T : Parent { } } class Child : Parent { public void Test() { //this line gives me a compiler error : The type argum
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();
}
}
类父类
{
public void InferrenceTesting(),其中T:Parent
{
}
}
类子:父
{
公开无效测试()
{
//此行给了我一个编译器错误:无法从用法推断出方法“Parent.InferrenceTesting()”的类型参数。请尝试显式指定类型参数。
这是一个;
}
}
我读了很多关于推理的书,但是我不知道为什么这不起作用。编译器没有可以推断的信息-您需要一个参数或一些其他信息来告诉编译器t应该是什么,以便推断它。编译器没有可以推断的信息-您需要一个参数或一些其他信息来告诉编译器什么
T
应该是,以便推断出它。它无法从中推断类型。您说过T
必须是Parent
的类型,但是由于您没有传递该类型的参数(编译器可以使用该参数推断类型),因此必须显式命名该类型。它无法从中推断类型。您说过T
必须是Parent
的一种类型,但由于您没有传递该类型的参数(编译器可以使用该参数推断类型),因此必须显式命名该类型。我在这方面不是专家,但我认为没有什么可以推断的
这个方法是在父类
派生中声明的这一简单事实与此无关
对于该方法,您需要一个类型为T
的参数,这样编译器就可以从中推断出什么应该用作T
在您的呼叫中,
T
不需要是父项
或子项
。它可以是任何东西,只要它继承自Parent
我不是这方面的专家,但我认为没有什么可以推断的
这个方法是在父类
派生中声明的这一简单事实与此无关
对于该方法,您需要一个类型为T
的参数,这样编译器就可以从中推断出什么应该用作T
在您的呼叫中,
T
不需要是父项
或子项
。它可以是任何东西,只要它继承自Parent
泛型方法类型参数到方法类型参数的推理是基于形式参数和形式参数之间的关系进行推理的
您的方法没有形式参数和形式参数,因此不进行任何推断
请注意,特别是从不从通用参数约束进行推断。约束不是方法签名的一部分,推理本身与签名有关。而是在类型推断成功后检查约束。如果您期望从where
子句中做出某种推断,那么您的期望是错误的
我读了很多关于推理的书,但我不知道为什么这不起作用
如果你对类型推断感兴趣,你可能希望阅读我的博客文章。它们可能比你读过的关于这个主题的其他一些文章更准确;我偶尔会在那里看到错误的信息。从我当前的博客:
以及我以前的Microsoft博客:
特别是,请参见
对那个博客的评论很有趣。如果你曾经想看到一百个人告诉我,我错了,设计错了,实现错了,好吧,这是应该去的地方 通过基于形式参数和形式参数之间的关系进行推理,将泛型方法类型参数推断为方法类型参数 您的方法没有形式参数和形式参数,因此不进行任何推断 请注意,特别是从不从通用参数约束进行推断。约束不是方法签名的一部分,推理本身与签名有关。而是在类型推断成功后检查约束。如果您期望从
where
子句中做出某种推断,那么您的期望是错误的
我读了很多关于推理的书,但我不知道为什么这不起作用
如果你对类型推断感兴趣,你可能希望阅读我的博客文章。它们可能比你读过的关于这个主题的其他一些文章更准确;我偶尔会在那里看到错误的信息。从我当前的博客:
以及我以前的Microsoft博客:
特别是,请参见
对那个博客的评论很有趣。如果你曾经想看到一百个人告诉我,我错了,设计错了,实现错了,好吧,这是应该去的地方 编译器没有什么可以推断的。该方法是泛型的,而不是类,因此没有信息告诉编译器
T
的类型应该是什么。请尝试使用参数,因为@DStanley声明编译器没有可推断的内容。编译器没有可推断的内容。该方法是泛型的,而不是类,因此没有信息告诉编译器T
的类型应该是什么。请尝试使用参数,因为@DStanley声明编译器没有任何可推断的内容。