2016-06-22 6 views
0

私は、コンパイラの警告のプロジェクトをクリーンアップするタスクを持っています。私は現在、ASP.NETとXamarinのソリューションで使用されているCSファイルに取り組んでいます。そこで私は、メソッドを持っている:プリプロセッサディレクティブを使用した非同期メソッドでの例外のスロー

Xamarinソリューションで
public override async SomeReturnTypeItem LoginAsync() 
    { 
#if __MOBILE__ 
     throw new NotSupportedException("Windows authentication is not supported in mobile version"); 
#endif 
    //some code 
    } 

私は#endif下のコードが到達不能であることを警告しています。 #endif#elseに置き換え、方法の最後に#endifと入力すると、メソッドにawait演算子がなく、同期して実行されるという警告が表示されます。このメソッドを警告から解放するにはどうすればよいですか?

+1

何を期待しましたか? '* __MOBILE__'が設定されていると*のコードに到達できません - 例外とそれ以降のコードは実行されません。警告を出さない場合は、コードを削除するか、 '#else'ディレクティブを使用してください。 –

+1

"メソッドが不足しています "という警告が表示される場合は、' async'キーワードを使用しないでください。それは両方のバージョンのためです。 –

+0

"some code"に 'await'が含まれていると仮定しても安全ですか?'の#else ...#endif'を使用して: –

答えて

0

私が使用した解決策は、コンパイラを不正行為させることです。

public override async SomeReturnTypeItem LoginAsync() 
    { 
#if __MOBILE__ 
     bool isMobile = true; 
     if (isMobile) 
     { 
      throw new NotSupportedException("Windows authentication is not supported in mobile version"); 
     } 
#endif 
     //some async code 
    } 

Visual Stuidioによると、非同期コードはヒューリスティックに到達できませんが、コンパイラは満足しています。もちろん、それは少し醜いですが、それは動作します。しかし、お手伝いをしてくれてありがとう)

0

それはちょっと醜いですが、あなたはこれを行うことができます:

public override 
#if !__MOBILE__ 
    async 
#endif 
    SomeReturnTypeItem LoginAsync() { 
#if __MOBILE__ 
    throw new NotSupportedException("Windows authentication is not supported in mobile version"); 
#else 
    //some code 
#endif 
    } 

これは、あなたが実際にどこかに「いくつかのコード」でawaitキーワードを持っていると仮定しています。そうでない場合は、asyncを削除するだけです。 #pragma warning

+0

問題は、それが' throw'後に任意のコードが*彼の修正と一緒に使用されることを意味している*到達不能 –

+0

@PanagiotisKanavosあることだasync' 'ではありません。私はそれをより明確にするために編集しました。 –

2

最も簡単な修正は

public override async SomeReturnTypeItem LoginAsync() 
{ 
#if __MOBILE__ 
    throw new NotSupportedException("Windows authentication is not supported in mobile version"); 
#else 
    //some code using await 
#endif 
} 

だろう。しかし__MOBILE__ がある場合ので、それは、おそらくあなたが望む正確に動作しません。

それとも、あなたは単に警告を抑制するために#pragmaディレクティブを使用することができますこのメソッドはすぐにスローするのではなく、エラーTaskを返します。あなたがすぐに待つのではなく、後で使用するためにTaskを保存すると(たとえば、いくつかのタスクを開始して同時に実行させたい場合など)、その差は非常に大きくなることがあります。

これを解決するには、別の方法で例外投げコードと非同期実装を置く必要があります。もちろん

public override SomeReturnTypeItem LoginAsync() 
{ 
#if __MOBILE__ 
    throw new NotSupportedException("Windows authentication is not supported in mobile version"); 
#else 
    return LoginAsyncImpl(); 
#endif 
} 

private async SomeReturnTypeItem LoginAsync() 
{ 
    //some code using await 
} 

、あなたがawaitを使用していない場合はすべてで、あなただけではないはず最初にasyncとしてあなたのメソッドをマークしてください!

public override omeReturnTypeItem LoginAsync() 
{ 
#if __MOBILE__ 
    throw new NotSupportedException("Windows authentication is not supported in mobile version"); 
#else 
    //some code not using await 
#endif 
} 

注非非同期コードはまだTaskを返すことができるという。これは、インプリメンテーションが本当に非同期になるようにいくつかのメソッドがタスクを返すようにするインターフェイスまたは基本クラスを実装する場合に便利ですが、具体的な実装は同期して行われます。

public override Task SomeMethodAsync() 
{ 
    // do some synchronous stuff 
    return Task.FromResutl(true); 
} 
+0

私はこの答えの2番目の部分が最善の解決策だと思います。 – Neil

+0

しかし、第一の部分が間違っている(または不完全)であるがために、質問で述べたように、彼はすでにそれを試み、それは別の警告を与えます。 –

関連する問題