默认的null泛型类型

时间:2018-05-23 11:56:39

标签: c# generics

当我尝试使用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; }
}

6 个答案:

答案 0 :(得分:4)

无法推断出所需类型,因为参数postDataT类型的唯一参数,是可选的,不会在方法的创新中使用。此外,通用函数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 : classobject

答案 4 :(得分:1)

该错误基本上意味着编译器无法确定您的T应该是哪种类型,因此您需要指定您的泛型类型。这通常没有必要,但在您的示例中,您使用T指定postData的类型,然后,当您尝试调用prepare()方法时,您没有指定{{ 1}}参数(你可以,因为它是默认的postData),所以编译器将无法知道你null的类型:

T

OR

var person = prepare<YourType>("", "");

答案 5 :(得分:0)

由于您已将prepare方法标记为通用,因此必须定义类型。我认为没有任何理由可以使用仿制药。