我正在使用.NET框架,我真的希望能够创建一个我所有网站都使用的自定义类型的页面.当我尝试从控件访问页面时出现问题.我希望能够返回我的特定类型的页面而不是默认页面.有没有办法做到这一点?
public class MyPage : Page
{
// My own logic
}
public class MyControl : Control
{
public MyPage Page { get; set; }
}
Run Code Online (Sandbox Code Playgroud) 有没有合理的理由说明为什么下面的代码在C#中不合法?
class X: IA, IB
{
public X test() // Compliation Error, saying that X is not IB
{
return this;
}
}
interface IA
{
IB test();
}
interface IB { };
Run Code Online (Sandbox Code Playgroud) 在回答另一个问题时,我试图做到以下几点.我不认为我正确地解释了这个问题,但我确实想知道下面是否可能以某种方式(我的尝试失败),如果不是为什么不:
public class MyBaseClass { }
public class MyClass : MyBaseClass { }
public class B<T> { }
public class A<T> : B<T> { }
static void Main(string[] args)
{
// Does not compile
B<MyBaseClass> myVar = new A<MyClass>();
}
Run Code Online (Sandbox Code Playgroud)
我认为这可以使用具有协变类型参数的通用接口来工作:
interface IB<out T> { }
public class B<T> : IB<T> { }
Run Code Online (Sandbox Code Playgroud)
但我错了,这也行不通.
编辑
正如SLaks指出的那样'接口是协变的; 上课不是.' (感谢SLaks).所以现在我的问题是为什么?这个设计背后的想法(我认为Eric Lippert的一个想法)是不可能的,不受欢迎的还是在'也许是一天'的名单上?
有谁知道为什么C#不支持协变返回类型?即使在尝试使用接口时,编译器也会抱怨它是不允许的.请参阅以下示例.
class Order
{
private Guid? _id;
private String _productName;
private double _price;
protected Order(Guid? id, String productName, double price)
{
_id = id;
_productName = productName;
_price = price;
}
protected class Builder : IBuilder<Order>
{
public Guid? Id { get; set; }
public String ProductName { get; set; }
public double Price { get; set; }
public virtual Order Build()
{
if(Id == null || ProductName == null || Price == null)
throw new InvalidOperationException("Missing required data!");
return …Run Code Online (Sandbox Code Playgroud)