[英]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
,所以您可以只使用object
: var 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.