2012-12-29 46 views
5

當運行的代碼此位的WriteLine顯示,Equation(10, 20)是輸出到控制檯:支持轉換爲Boolean但仍然已經使用的ToString

public class Equation 
{ 
    public int a; 
    public int b; 

    public override string ToString() 
    { return "Equation(" + a + ", " + b + ")"; } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.WriteLine(new Equation() { a = 10, b = 20 }); 

     Console.ReadLine(); 
    } 
} 

我想支持Equation實例中的測試使用一個if所以我允許隱式轉換Boolean

public class Equation 
{ 
    public int a; 
    public int b; 

    public override string ToString() 
    { return "Equation(" + a + ", " + b + ")"; } 

    public static implicit operator Boolean(Equation eq) 
    { return eq.a == eq.b; } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     if (new Equation() { a = 10, b = 10 }) 
      Console.WriteLine("equal"); 

     Console.WriteLine(new Equation() { a = 10, b = 20 }); 

     Console.ReadLine(); 
    } 
} 

但是,麻煩的是,現在,當我上Equation使用WriteLine,它得到的轉換ŧ o Boolean而不是使用ToString打印。

我該如何允許隱式轉換爲Boolean,仍然有WriteLine顯示使用ToString


更新

這個問題是由EquationSymbolicC++啓發。下面的代碼說明了一個Equation可以經由cout被顯示以及在if的測試中使用:

auto eq = x == y; 

cout << eq << endl; 

if (eq) 
    cout << "equal" << endl; 
else 
    cout << "not equal" << endl; 

所以這是可能以某種方式在C++中。

回答

7

你不能用一個bool轉換做到這一點,但你可以重載truefalse運營商爲Equation。當然Equation不會隱式轉換爲bool任何更多,但你仍然可以使用它在ifwhiledofor語句和條件表達式(即?:運營商)。

public class Equation 
{ 
    public int a; 
    public int b; 

    public override string ToString() 
    { return "Equation(" + a + ", " + b + ")"; } 

    public static bool operator true(Equation eq) 
    { 
     return eq.a == eq.b; 
    } 

    public static bool operator false(Equation eq) 
    { 
     return eq.a != eq.b; 
    }  
} 

從你的例子:

if (new Equation() { a = 10, b = 10 }) 
    Console.WriteLine("equal"); // prints "equal" 

Console.WriteLine(new Equation() { a = 10, b = 20 }); // prints Equation(10, 20) 
+0

哇,你釘牢了Mike。謝謝! – dharmatech

+0

雖然「方程式」在您列出的語句中工作,但似乎它們不適用於運算符'||'和'&&'。只是想我會提到這個人誰正在考慮這個選項。 – dharmatech

+0

@dharmatech正如我所說,它不再可以轉換爲'布爾'。你也可以重載'&'和'|'運算符,但是它的使用是有限的,因爲你仍然不能像'eq && true'這樣做。我真的同意Jon的評論,認爲這樣的事情有點太聰明,可能會讓代碼和未來維護者的消費者感到困惑。 –

12

據我所知,你不能。你可以提供一個轉換爲字符串...但這會使呼叫在WriteLine(string)WriteLine( bool之間不明確)。

我個人倒強烈建議您溝隱式轉換Boolean。隱式轉換幾乎是總是不好主意。他們使代碼更加混亂,並導致無意識的過載更改,正如您找到的。

(我也想改變你的風格支撐,但是這是一個不同的問題。)

+2

實際上,你可以) – SergeyS

+0

喬恩,請通過 '麥克Z' 的答案。這非常符合我的要求。你認爲這種方法有什麼缺點嗎? – dharmatech

+11

@dharmatech:好吧,它不會回答你所說的問題,這是爲了保持隱式轉換爲'bool'。就個人而言,我不會讓「真」和「虛」操作符超負荷 - 我會更加明確地說明事情。我發現,像這樣的運營商試圖「可愛」通常會導致代碼難以維護。 YMMV當然 - 但我會非常小心。 –

8

這是因爲Console.WriteLine(布爾)超載被調用,而不是Console.WriteLine(對象)。你可以明確地轉換爲對象,並要求超載將被稱爲:

Console.WriteLine((object)(new Equation() { a = 10, b = 20 })); 

或可替代expliciltly調用的ToString():

Console.WriteLine((new Equation() { a = 10, b = 20 }).ToString()); 
相關問題