7

次のMSユニットテストに出くわしました:

[TestMethod]
public void PersonRepository_AddressCountForSinglePerson_IsNotEqualToZero()
{
   // Arrange.
   Person person;

   // Act.
   person = personRepository.FindSingle(1);

   // Assert.
   Assert.AreNotEqual<int>(person.Addresses.Count, 0); 
}

アサーションを行うときにジェネリックを使用するのを見たことがありません。

これは私がアサーションを書く方法です:

// Assert.
Assert.AreNotEqual(person.Addresses.Count, 0);

違いはなんですか?

使用しているオーバーロードにカーソルAreNotEqual()を合わせると、メソッドは 2 つの double を比較するオーバーロードを使用しています (なぜ int、int オーバーロードがないのかわかりません)。

そして、ジェネリック型パラメーターを入れた場合、ReSharper はそれが冗長であると言います<int>

だから私の質問は:私がそれを行う方法がまだタイプセーフである場合、なぜジェネリックアサーションを使用するのですか?

4

1 に答える 1

5

だから私の質問は - 私がそれを行う方法がまだタイプセーフである場合、なぜ一般的なアサーションを使用するのですか?

現在、一般的なアサーションを使用しています。コンパイラはジェネリック メソッドを確認し、コンパイル時にそれを選択します。これが、Resharper が<int>冗長であると言っている理由です。これは、メソッドが冗長であるからではなく、そのAssert.AreNotEqual<int>メソッドが使用する適切なメソッドであるとコンパイラが暗黙的に判断できるためです。

一般に、ジェネリクスでは型を指定する必要がないことがよくあります。これが LINQ 構文を耐えられるものにしています。これがないと、チェーン内のすべてのメソッド呼び出しで型を指定する必要があり、匿名型は使用できなくなります。

そうは言っても、ジェネリック型の指定が必要な場合があります。これは主に、引数リストに一致するパラメーターがない場合 (つまり: Foo.Create<MyClass>())、または他の理由で型を判別できない場合など、コンパイラーが自動的に型を判別できない場合です。

于 2010-10-15T00:57:39.587 に答える