簡體   English   中英

C#使自動ToString轉換無效

[英]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.

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