[英]C# Invalidate automatic ToString conversion
在C#中,我有一個類:
public class Person
{
public string name;
public int id;
}
目前,當我這樣做時:
Person person = new Person
{
name = "John",
id = 3
}
// Will be converted Console.Writeline("Person = " + person.ToString()); by the compiler
Console.Writeline("Person = " + person);
我可以在該類中做什么以使從person到person.ToString()的自動轉換無效並使編譯器給出錯誤消息,以指示不能將Person對象隱式轉換為字符串?
我可以在該類中做什么以使從person到person.ToString()的自動轉換無效並使編譯器給出錯誤消息,以指示不能將Person對象隱式轉換為字符串?
您不能,至少不能以簡單的方式。 string
+ object
的重載將是在object
上發出ToString
的重載,您無法對其進行控制。 這在規范的“ 加法運算符(7.7.4)”部分(強調我的)中指定:
當一個或兩個操作數的類型為string時,binary +運算符將執行字符串連接。 如果字符串連接的操作數為null,則替換為空字符串。 否則,通過調用從類型對象繼承的虛擬ToString方法,將任何非字符串參數轉換為其字符串表示形式。 如果ToString返回null,則替換為空字符串。
您可以執行的操作(不是編譯時警告)是從重載的ToString
引發異常。 我絕對建議不要這樣做 。 您可以編寫一個Roslyn分析器來查找傳遞給Console.WriteLine
任何對象,而不會覆蓋ToString
方法並為此發出警告。
您必須編寫不帶有+運算符的重載的編程語言,該運算符接受一個字符串和一個對象作為其兩個操作數。 照原樣 ,如果您使用的C#聲明這樣的運算符重載是語言規范的一部分 ,那么您顯示的代碼必須在C#中編譯。 為了使該操作無法編譯,將需要使用不符合C#語言規范的語言。
在覆蓋ToString方法並將其標記為過時時使用new關鍵字可以解決問題。
public class Person
{
public string name;
public int id;
[Obsolete("this should not be used", true)]
public new string ToString()
{
return null;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.