簡體   English   中英

默認為null的通用類型

[英]Default null generic type

當我嘗試使用prepare("", ""); 我收到編譯錯誤,為什么? 我將默認值設置為null現在是什么編譯器。我說如果我不把任何類放在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; }
}

無法推斷出所需的類型,因為參數postData是類型T的唯一參數,它是可選的,並且不用於方法的轉換中。 此外,通用函數prepare不使用postData ,這意味着可以將其刪除。

prepare定義中刪除參數將是問題的一種解決方案,在調用中提供所需類型的參數將是問題的另一種解決方案。

我說如果我不把任何課程放在那里

這不是默認參數的全部工作方式。 它們在呼叫站點被編譯。 調用方可以傳遞null ,但仍然不知道null的“類型”。

如果您沒有為T postData提供參數,則無法推斷T的類型,必須明確提供T的類型。

因此: prepare<Person>("", "")

問題是即使您不提供T ,編譯器也需要知道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推斷一個類型,因此您必須提供它-即使在運行時為arg提供null postData實際上為null是一個運行時信息, 編譯器沒有此信息-它僅查看類型 ,而不查看實際

除此之外,很難建議您實際需要什么。 根據您的實際代碼以及您對postData您甚至可能根本不需要泛型。

編譯器錯誤非常明顯-由於任何引用類型都可以為null ,因此編譯器無法從null推斷類型。

您必須指定如下類型: var person = prepare<SomeTypeHere>("", "");

顯然,用相關類型替換SomeTypeHere 因為它為null,並且唯一的通用約束是where T : class ,所以您可以只使用objectvar person = prepare<object>("", "");

該錯誤基本上意味着編譯器無法弄清楚您的T應該是哪種類型,因此您需要指定通用類型。 通常沒有必要,但是在您的示例中,您使用T來指定postData類型,然后,當您嘗試調用prepare()方法時,沒有指定postData參數(並且可以將其postData默認null )。 ,因此編譯器將無法知道您的T類型:

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

要么

YourType postData = GetPostData();
var person = prepare("", "", postData);

在將prepare方法標記為泛型之后,您必須定義一個類型。 我在那里看不到任何泛型的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM