了解一般编译错误

本文关键字:错误 编译 了解 | 更新日期: 2023-09-27 18:29:58

我有两个抽象类:

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"必须是具有公共无参数构造函数,以便将其用作参数泛型类型或方法"generic"中的"BaseViewModel"

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

了解一般编译错误

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

问题是BaseViewModelT有一个约束,即T可以通过new T()构造。由于BasePoco是抽象的,因此它不能通过new BasePoco()来构造。因此,BaseViewModel<BasePoco>不是一个有效的类型。

如何解决这个问题?

由于您所做的一切都是处理对象,因此可以将其强制转换为IDisposable,如下所示:

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

这是因为抽象类的公共构造函数不是完全公共的,因为你不能直接调用它。其中一个可能的修复方法是在不需要的情况下从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();