2016-04-02 13 views
2

下面的程序編譯在Visual Studio 2015更新2細,而是一個「角色是多餘的」被生成警告:「角色是多餘的」警告當返回否定布爾

class Program 
{ 
    static void Main(string[] args) 
    { 
     Program p = new Program(); 
     bool negated = p.NegateBool(true); 
    } 

    public bool NegateBool(object value) 
    { 
     // "Cast is redundant" warning. 
     return !(bool)value; 

     // No warning. 
     //return (bool)value; 

     // No warning. 
     //var negated = !(bool)value; 
     //return negated; 
    } 
} 

當接受了「快速修復」建議刪除演員,該程序不再編譯。

只有在直接在返回語句中完成強制轉換並使用了否定運算符時纔會發生這種情況。

如果結果放入一個變量然後返回,則不會生成警告。

有誰知道爲什麼會發生這種情況?

+0

你或許應該提交與羅斯林團隊的bug報告。他們通常在Github上,而且非常有幫助。 – Joey

+1

是的,如果你還沒有,請在https://github.com/dotnet/roslyn上提交一個錯誤。 –

+0

我已經提交了一個錯誤報告。 –

回答

-2

bool negated = p.NegatedBool(true);

編譯器已經知道你在傳遞布爾值。 嘗試truee而不是true,它會給你一個錯誤。如果你輸入true,編譯器就知道它是一個來自system.boolean的布爾值,只需將鼠標懸停在true上即可。所以現在編譯器已經知道它是一個bool。 只是在您的方法的第一行放置一個調試點。多數民衆贊成在開放大括號,並去調試。如果您將值添加到值,您將會知道它可能會顯示類似此對象{bool}的類型。

+0

「NegateBool」的參數屬於'object'類型。這聽起來像是一個Roslyn錯誤。 – Joey

+0

嗯......我想他應該宣佈他的方法公共布爾NegateBool(布爾值)。多數民衆贊成在一種方式.. –

+0

這不是關於可疑的編程實踐。是的,現在的代碼並不複雜。是的,它可以被簡化。但那不是重點。這是關於一個分析器和快速修復的奇怪行爲,這表明一個更改會阻止程序編譯。他們在那裏的代碼可能已經是一個簡單的例子,並不是從實際的項目中逐字逐句的。 – Joey

相關問題