5

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

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

listOfMyObjects.Sort(MyObject.CompareFieldNames);

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

listOfMyObjects.Sort();

然后我会得到一个编译时错误。

(我确实意识到我会得到一个运行时错误 - 但我更喜欢的是某种方式得到一个编译时错误。)

编辑:

为了清楚起见,我为上面的第二个示例获取编译时错误。

我偶尔会遇到的情况是,我有一个包含几种不同比较<> 方法的类。假设它可以按 FieldName 排序,也可以按 DateOfCreation 排序。现在,我要避免意外/错误地思考,“哦,是的,好的旧对象 X,它可以按创建日期排序,所以我将使用 Sort() 对这个列表进行排序,然后愉快地前进...... ",但实际上默认排序方式是按FieldName排序(所以排序错误)或者没有默认排序方式(所以出现运行时错误)。

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

4

3 回答 3

4

您可以编写自定义 FxCop 规则,请参阅此处获取教程。

查看本教程的代码分析。

于 2012-11-30T11:59:10.913 回答
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
}

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

于 2012-11-30T11:36:35.087 回答
1

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

于 2012-11-30T11:43:32.743 回答