了解一般编译错误
本文关键字:错误 编译 了解 | 更新日期: 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"
我不知道为什么,你能解释一下以及如何解决这个问题吗?
我不知道为什么,你能解释一下吗
问题是BaseViewModel
对T
有一个约束,即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();