从Idisposable实现泛型类时编译时的不同行为?

时间:2017-04-26 09:01:37

标签: c# .net generics idisposable

为什么在以下代码的情况下行为会发生变化

public class Repository<T> : IRepository<T> where T : BaseEntity, IDisposable

public class Repository<T> : IDisposable, IRepository<T> where T : BaseEntity

如果我将实现类留空,在上面的例子中它不希望我实现Dispose()方法。但是,在下面需要实现Dispose()方法。 以下是完整的测试代码:

public interface Itest<T> where T: testA{ }
public class testA { }
public class test2<T> : Itest<T> where T : testA,IDisposable{ } //successfully compiled
public class test3<T> : IDisposable, Itest<T> where T : testA { }//Failed compiled : need to implement Dispose()

2 个答案:

答案 0 :(得分:3)

当你有

public class Repository<T> : IRepository<T> where T : BaseEntity, IDisposable

然后T必须实施IDisposable

当你有

public class Repository<T> : IDisposable, IRepository<T> where T : BaseEntity

然后Repository必须实施IDisposable

如果要创建test2<T>的实例,则应提供从testA派生并实现IDisposable的通用参数。

答案 1 :(得分:1)

在第一个代码示例中,IDisposable必须实现Repository。在第二个代码示例中,IDisposable本身必须实现var array1 = [ { "id": 1, "name": 'One' }, { "id": 2, "name": 'Two' } ]; var array2 = [ { "id": 1, "name": 'Uno' }, { "id": 3, "name": 'Three' } ]; function mapArrays(arr1, arr2) { var tmp = _.map(arr1, function(val) { var o = _.first(_.filter(arr2, function(a2) { return a2.id === val.id; })); return !!o ? o : val; }); return _.union(tmp, _.filter(arr2, function(val) { return !_.some(tmp, function(a2) { a2.id == val.idl }); })); } var final = mapArrays(array1, array2); console.log(final);