List<> .Sort()需要编译时错误,没有排序规范

时间:2012-11-30 11:15:47

标签: c# .net

是否有某种方法可以定义一个类,如果我错误地尝试对List<>进行排序没有排序规范的对象会产生编译时错误吗?

所以当我正确指定时,例如

listOfMyObjects.Sort(MyObject.CompareFieldNames);

它将被接受,但如果我忘记并指定

listOfMyObjects.Sort();

然后我会收到编译时错误。

(我确实知道我会遇到运行时错误 - 但我更喜欢的是获取编译时错误的一些方法。)

编辑:

为了说清楚,我想要来获取上面第二个例子的编译时错误。

我偶尔发现自己的情况是,我有一个班级有几个不同的比较<>方法。假设它可以按FieldName排序,也可以按DateOfCreation排序。现在,我想要避免的是意外/错误地思考,“哦,是的,好旧的对象X,它可以按创建日期排序,所以我只是用Sort()对这个列表进行排序,并在我的路上愉快地去... “,但实际上默认排序方法是按字段名排序(因此排序错误)或者没有默认排序方法(所以我得到运行时错误)。

所以我想强迫自己(或其他任何使用我的对象的人)记住有几种方法可以对对象进行排序,其中一种方法应该明确选择。

3 个答案:

答案 0 :(得分:4)

您可以编写自定义FxCop规则,有关教程,请参阅here

查看代码分析的this tutorial

答案 1 :(得分:2)

你可以通过子类化然后使用ObsoleteAttribute来做到这一点 - 不理想,但你会收到错误:

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
}

但是,只有l的编译时类型为MyList<T>才有效,因为您只是定义了一个替换基本版本的新Sort方法 - 但它不是virtual

答案 2 :(得分:1)

无法强制编译时错误。您可以设置像Obsolete这样的规则,但这只是解决方法。