如何解决这个c#语法难题?

如何解决这个c#语法难题?,c#,.net,logic,C#,.net,Logic,有人能给我以下代码难题的解决方案吗? 给出了一个解决方案,但可以是多个解决方案 // this code compiles IAnimal animal= new Dog(); animal.Eat(); // this code doesn't compile Dog animal = new Dog(); animal.Eat(); 类定义应该是什么样子的,以便上述代码块在不同的作用域中编译(第一个)和不编译(第二个)?public interface IAnimal { 空吃(); }

有人能给我以下代码难题的解决方案吗? 给出了一个解决方案,但可以是多个解决方案

// this code compiles
IAnimal animal= new Dog();
animal.Eat();

// this code doesn't compile
Dog animal = new Dog();
animal.Eat();
类定义应该是什么样子的,以便上述代码块在不同的作用域中编译(第一个)和不编译(第二个)?

public interface IAnimal
{
空吃();
}
公家犬:IAnimal
{
void IAnimal.Eat(){}
}
i动物=新狗();

动物。吃() 您可以通过使用显式接口实现来实现这一点:

class Dog : IAnimal {
    void IAnimal.Eat(){
        //do stuff
    }
}
与隐式接口实现相反:

class Dog : IAnimal {
    public void Eat(){
        //do stuff
    }
}

导致第二行错误的原因是类
Dog
显式实现了
IAnimal
接口,如下所示:

class Dog : IAnimal
{
    void IAnimal.Eat()
    {
        throw new NotImplementedException();
    }
}
在本例中,第二行出现编译错误,因为除非您使用的是
IAnimal
的实例,否则无法调用
Eat
,因为它本质上是
Dog
中的私有方法

要修复此错误,您需要将实例转换回我在上面向您展示的
IAnimal
,或者您可以隐式实现如下接口:

class Dog : IAnimal
{
    public void Eat()
    {
        throw new NotImplementedException();
    }
}
其他答案中已经提供了显而易见的解决方案(
IAnimal
是接口,
Dog
是显式实现该接口的类)

以下是我能想到的一些其他方法

它们都是基于
IAnimal
这样一个(命名不好的)类

public class IAnimal
{
    public void Eat() { }
}
(A) 基于类定义隐式转换运算符的解决方案(请注意,禁止定义从类到接口的转换,这就是为什么作为类/结构非常重要的原因)

在第二个代码段中导致以下编译错误:

错误CS1061:“Dog”不包含“Eat”的定义,并且找不到接受类型为“Dog”的第一个参数的扩展方法“Eat”(是否缺少using指令或程序集引用?)

(B) 基于基本方法隐藏的解决方案。虽然在C#中,我们不能通过在派生类中提供另一个具有不同签名的方法来隐藏基方法(因为它将被视为重载),但我们可以通过使用签名不兼容的字段属性事件来隐藏基方法

比如说

public class Dog : IAnimal
{
    new public event Action Eat;
}
产生

错误CS0070:事件“Dog.Eat”只能出现在+=或-=的左侧(从类型“Dog”中使用时除外)

公共级狗:IAnimal
{
新公共行动;
}
产生

错误CS7036:未给出与“Action”的必需形式参数“obj”对应的参数


这段代码没有编译-编译器错误是什么?如果IAnimal可以eat()并且Dog是IAnimal,那么根据定义Dog可以eat()。@Domysee-他们不是说他们的代码没有编译-他们是在问如何编写代码,以便上面两行生成所需的编译/不编译行为。@pstrjds哦,对了。感谢您的澄清OP询问的是如何生成这样做的代码,而不是如何调用代码使其工作。他们没有任何代码——请注意问题中的这一行——“类的定义应该是什么样子,以便上面的代码块在不同的范围内,编译(第一个)和不编译(第二个)”,解释一下为什么回答这个问题可以帮助OP理解这个答案。
public class Dog
{
    public static implicit operator IAnimal(Dog dog) { return new IAnimal(); }
}
public class Dog : IAnimal
{
    new public event Action Eat;
}
public class Dog : IAnimal
{
    new public Action<int> Eat;
}