5

ソート指定のないオブジェクトのList<>を誤ってソートしようとすると、コンパイル時エラーが発生するようにクラスを定義する方法はありますか?

だから私が正しく指定すると、例えば

listOfMyObjects.Sort(MyObject.CompareFieldNames);

それは受け入れられますが、私が忘れて指定した場合

listOfMyObjects.Sort();

次に、コンパイル時エラーが発生します。

(私はランタイムエラーが発生することを認識していますが、私が好むのはコンパイル時エラーを取得する何らかの方法です。)

編集:

明確にするために、上記の2番目の例ではコンパイル時エラーが発生します

私が時々遭遇する状況は、私がいくつかの異なるComparison<>メソッドを持つクラスを持っているということです。FieldNameで並べ替えることも、DateOfCreationで並べ替えることもできるとしましょう。さて、私が避けたいのは、誤って/誤って考えていることです。「ああ、古き良きオブジェクトX、作成日で並べ替えることができるので、このリストをSort()で並べ替えて、楽しく進んでいきます... "ですが、実際には、デフォルトの並べ替え方法はFieldNameによる並べ替えであるか(並べ替えが間違っています)、またはデフォルトの並べ替え方法がありません(したがって、実行時エラーが発生します)。

したがって、私は自分自身(または私のオブジェクトを操作している他の人)に、オブジェクトを並べ替える方法がいくつかあり、メソッドの1つを明示的に選択する必要があることを覚えてもらいたいと思います。

4

3 に答える 3

4

You could write a custom FxCop rule, see here for a tutorial.

Have a look at this tutorial for Code Analysis.

于 2012-11-30T11:59:10.913 に答える
2

You can do it by sub-classing and then with the ObsoleteAttribute - not ideal, but you'll get an error:

public class MyList<T> : List<T>
{
  public MyList() {}
  public MyList(int capacity) : base(capacity) {}
  public MyList(IEnumerable<T> range) : base(range) {}

  [Obsolete("Please do not use this method", true)]
  public new void Sort(){ throw new NotSupportedException(); }
}

public void Test() 
{
  var l = new MyList<string>();
  l.Sort(); //<--- compile-time error
}

Only works, however, if the compile-time type of l is MyList<T>, because you're just defining a new Sort method that replaces the base version - but it's not virtual.

于 2012-11-30T11:36:35.087 に答える
1

Forcing compile time error is not possible. You can set rules like Obsolete but that are just workaround.

于 2012-11-30T11:43:32.743 に答える