了解通用编译错误

时间:2016-01-12 19:59:02

标签: c# generics

我有2个抽象类:

BasePoco:

public abstract class BasePoco
{
    public BasePoco(){}
  // Properties etc...
}

BaseViewModel:

public abstract class BaseViewModel<T> where T : BasePoco, new()
{
  // ViewModel stuff...
}

如果我尝试这样的话:

            var baseViewModel = currentView.DataContext as BaseViewModel<BasePoco>;
            if (baseViewModel != null)
                baseViewModel.Dispose();

我总是遇到以下编译错误:

  

“BasePoco”类型必须是带有public的非抽象类型   无参数构造函数,以便将其用作参数   泛型类型或方法'泛型'中的'BaseViewModel'

我不知道为什么,你能解释一下,如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

  

我不知道为什么,你能否解释一下

问题在于BaseViewModelT有约束,T可以通过new T()构建。由于BasePoco是抽象的,因此无法通过new BasePoco()构建它。因此,BaseViewModel<BasePoco>不是有效类型。

  

如何解决这个问题?

由于您正在处理的所有内容都是处置对象,因此您可以将其转换为IDisposable,如下所示:

var disposable = currentView.DataContext as IDisposable;
if (disposable != null)
    disposable.Dispose();

答案 1 :(得分:1)

这是因为抽象类的公共构造函数不是完全公开的,因为你无法直接调用它。其中一个可能的修复方法是,如果没有必要,请从ViewModel删除new()约束。

public abstract class BaseViewModel<T> where T : BasePoco
{
    // ViewModel stuff...
}

另一种选择是使用Dispose()方法使用非geric类:

public abstract class BaseViewModel
{
    public void Dispose() {} // or abstract method
}

public abstract class BaseViewModel<T> : BaseViewModel 
    where T : BasePoco, new()
{
    // ViewModel stuff...
}

var baseViewModel = currentView.DataContext as BaseViewModel;
if (baseViewModel != null)
    baseViewModel.Dispose();