2016-04-02 6 views
2

を返すときに、次のプログラムは、アップデート2のVisual Studio 2015年には罰金コンパイルしますが、「キャストが冗長である」という警告が生成されます。「キャストが冗長である」警告否定ブール

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; 
    } 
} 

「クイックフィックス」を受け付けた場合キャストを削除するための提案、プログラムはもうコンパイルされません。

これは、キャストがreturnステートメントで直接行われ、否定演算子が使用されている場合にのみ発生します。

結果が変数に入れられてから返された場合、警告は生成されません。

これはなぜ起こっているのですか?

+0

おそらくロザリンチームにバグレポートを提出しなければなりません。彼らはGithubにあり、とても役に立ちます。 – Joey

+1

まだ、https://github.com/dotnet/roslynにバグを報告してください。 –

+0

私はバグレポートを提出しました。 –

答えて

-2

bool negated = p.NegatedBool(true);

コンパイラは、この時点であなたが渡してブール値であることを既に知っています。 trueの代わりにtrueeを試してみると、エラーが発生します。 trueと入力した場合、コンパイラはsystem.booleanのbooleanを知っています。マウスを真の上に置くだけです。 これで、コンパイラはすでにそのブールを知っています。 メソッドの最初の行にデバッグポイントを置くだけです。開いている中括弧です。デバッグに行きます。価値のある時計を追加すると、そのオブジェクトにこのオブジェクト{bool}のようなものが表示されることがあります。

+0

'NegateBool'の引数は' object'型です。これはRoslynバグのように聞こえる。 – Joey

+0

hmmm ...私は彼がpublic bool NegateBool(bool値)として彼のメソッドを宣言するべきだと思います。それは一方的なことだ。 –

+0

これは疑わしいプログラミングpraxisについてではない。はい、そのままのコードは複雑ではありません。そして、それは単純化することができます。しかし、それはポイントではありません。これは、アナライザーの不思議な動作とクイックフィックスに関するもので、プログラムのコンパイルを妨げる変化を示唆しています。彼らが持っているコードは、すでに最小限の例であり、実際のプロジェクトからそのまま受け継がれているとは限りません。 – Joey

関連する問題