8

次のコードを書くと、ReSharperは可能性があることを警告していますNullReferenceExceptionnullただし、上記のステートメントで明示的にチェックしています。私が知らないことについて何かありますかdynamic(それはそれがまたはそのようなものによって裏付けられているかもしれないと仮定していIEnumerableますか?)それとも、これはReSharperの不具合ですか?または、他の何か?

dynamic user = connection.Query("SELECT ...").FirstOrDefault(); // Dapper Extension
if (user == null)
    return null;

return new User(user.username);
//              ^^^^
// (local variable) dynamic user
//
// Possible 'System.NullReferenceException'
4

2 に答える 2

5

問題は、それuser == nullが動的な呼び出しであるということです。userR#は、オブジェクトの実行時タイプに、正しく機能する等式演算子があると想定することはできません。それは非常に簡単に持つことができます:

public static bool operator ==(Foo x, Foo y) { return false; }
public static bool operator !=(Foo x, Foo y) { return true; }

この場合、変数が参照であったとしても、user == nullは常にを返します。falseusernull

コードを次のように変更してみてください。

if (ReferenceEquals(user, null)) return null;
return new User(user.username);

注意:この問題は、「エンティティの値がnullになる可能性があると想定する」オプションが「エンティティに明示的なNotNull属性がない場合」に設定されている場合にのみ発生します。

于 2013-07-04T19:25:07.260 に答える
1

これを試して :

dynamic user = connection.Query("SELECT ...").FirstOrDefault(); // Dapper Extension
if (user != null)
    return new User(user.username);

return null;
于 2013-07-04T17:32:55.873 に答える