我有一个界面:
interface IProfile { ... }
......和一个班级:
[Serializable]
class Profile : IProfile
{
private Profile()
{ ... } //private to ensure only xmlserializer creates instances
}
......和一位经理用方法:
class ProfileManager
{
public T Load<T>(string profileName) where T : class, IProfile
{
using(var stream = new .......)
{
var ser = new XmlSerializer(typeof(T));
return (T)ser.Deserialize(stream);
}
}
}
我希望这个方法可以这样使用:
var profile = myManager.Load<Profile>("TestProfile"); // class implementing IProfile as T
...并在此处抛出编译时错误:
var profile = myManager.Load<IProfile>("TestProfile"); // NO! IProfile interface entered!
但是,所有内容都会编译,XmlSerializer
只会引发运行时错误。
我认为where T : class
只会确保接受的类类型?
如果输入IProfile
(或继承自IProfile
的其他接口),是否可以使编译器抛出错误,并且只接受实现IProfile
的类型?
答案 0 :(得分:23)
根据MSDN类,意味着T必须是引用类型;这也适用于任何类,接口,委托或数组类型。
一个解决方法是要求T实现参数less constructor:
where T : class, IProfile, new()
答案 1 :(得分:0)
为我工作
<div class="container">
<div class="row">
<div class="col-md-3 col-md-offset-1 text-center">
<img alt="TBD" width="100%" src="https://via.placeholder.com/150" />
</div>
<div class="col-md-3 col-md-offset-1 text-center">
<img alt="TBD" width="100%" src="https://via.placeholder.com/150" />
</div>
<div class="col-md-3 col-md-offset-1 text-center">
<img alt="TBD" width="100%" src="https://via.placeholder.com/150" />
</div>
</div><!-- end row -->
</div><!-- end container -->