是否有某种方法可以定义一个类,如果我错误地尝试对List<>进行排序没有排序规范的对象会产生编译时错误吗?
所以当我正确指定时,例如
listOfMyObjects.Sort(MyObject.CompareFieldNames);
它将被接受,但如果我忘记并指定
listOfMyObjects.Sort();
然后我会收到编译时错误。
(我确实知道我会遇到运行时错误 - 但我更喜欢的是获取编译时错误的一些方法。)
编辑:
为了说清楚,我想要来获取上面第二个例子的编译时错误。
我偶尔发现自己的情况是,我有一个班级有几个不同的比较<>方法。假设它可以按FieldName排序,也可以按DateOfCreation排序。现在,我想要避免的是意外/错误地思考,“哦,是的,好旧的对象X,它可以按创建日期排序,所以我只是用Sort()对这个列表进行排序,并在我的路上愉快地去... “,但实际上默认排序方法是按字段名排序(因此排序错误)或者没有默认排序方法(所以我得到运行时错误)。
所以我想强迫自己(或其他任何使用我的对象的人)记住有几种方法可以对对象进行排序,其中一种方法应该明确选择。
答案 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这样的规则,但这只是解决方法。