首页 > 解决方案 > 默认空泛型类型

问题描述

当我尝试使用时prepare("", "");出现编译错误,为什么?我将默认值设置为null,现在编译器是什么意思。我说如果我没有放任何类,就把它放在那里。

错误 CS0411 无法从用法中推断方法“Program.prepare(string, 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; }
}

标签: c#generics

解决方案


问题是编译器需要知道什么是类型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您甚至可能根本不需要泛型。


推荐阅读