当我尝试使用prepare("", "");
时,我收到编译错误的原因是什么?我设置默认值null什么是点编译器现在。我说如果我没有把任何类放在那里null。
错误CS0411方法' Program.prepare的类型参数(字符串, string,T)'无法从使用中推断出来。尝试指定类型 明确的论点。
class Program
{
static void Main(string[] args)
{
var person = prepare("", "");
}
private static Person prepare<T>(string test, string Url, T postData = null)
where T : class
{
//if postdata null do somethnig (post data can be any class it is
//not person class)
//than return person
}
}
class Person
{
public int age { get; set; }
public string name { get; set; }
}
答案 0 :(得分:4)
无法推断出所需类型,因为参数postData
是T
类型的唯一参数,是可选的,不会在方法的创新中使用。此外,通用函数prepare
不使用postData
,这意味着它可以被删除。
从prepare
的定义中删除参数将是问题的一个解决方案,在invoaction中给出所需类型的参数将是问题的不同解决方案。
答案 1 :(得分:4)
我说如果我没有把任何课程放在那里
这并不完全是默认参数的工作原理。它们在呼叫站点编译。来电者可以通过null
,但仍然不知道&#34;键入&#34; null。
如果您没有为T postData
提供论据,则无法推断出T
的类型,并且必须明确提供。
所以:prepare<Person>("", "")
。
答案 2 :(得分:4)
问题是编译器需要知道T
是什么类型,即使你没有提供它。想象一下,您将使用提供的参数执行任何操作:
private static Person prepare<T>(string test, string Url, T postData = null)
where T : MyClass
{
if(T != null) t.DoSomething();
return new Person();
}
现在编译器必须推断T
的类型,因此您必须提供它 - 即使在运行时您提供null
对于arg。 postData
实际上null
是运行时 - 信息,编译器没有此信息 - 它只关注类型,而不是实际的值。
除此之外,很难说出你真正需要的东西。根据您的实际代码以及您使用postData
所做的事情,您甚至可能根本不需要泛型。
答案 3 :(得分:3)
编译器错误非常明确 - 因为任何引用类型都可以是help(sum)
,编译器无法从null
推断出类型。
您必须指定如下类型:null
显然,将var person = prepare<SomeTypeHere>("", "");
替换为相关类型。由于它是null,并且您唯一的通用约束是SomeTypeHere
,因此您可以使用where T : class
:object
答案 4 :(得分:1)
该错误基本上意味着编译器无法确定您的T
应该是哪种类型,因此您需要指定您的泛型类型。这通常没有必要,但在您的示例中,您使用T
指定postData
的类型,然后,当您尝试调用prepare()
方法时,您没有指定{{ 1}}参数(你可以,因为它是默认的postData
),所以编译器将无法知道你null
的类型:
T
OR
var person = prepare<YourType>("", "");
答案 5 :(得分:0)
由于您已将prepare
方法标记为通用,因此必须定义类型。我认为没有任何理由可以使用仿制药。