这段代码有什么不好?这是一个简单的例子:
class Program
{
public interface IAccount
{
}
public class Account :IAccount
{
}
public static IAccount LogOn()
{
return new Account();
}
public class Avatar
{
public Account Cred { get; set; }
}
static void Main(string[] args)
{
var avatar = new Avatar();
avatar.Cred = LogOn();
}
}
我收到编译错误:
Error 5 Cannot implicitly convert type 'console.Program.IAccount' to 'console.Program.Account'. An explicit conversion exists (are you missing a cast?) C:\Users\Jan\Documents\Visual Studio 2010\Projects\BACKUP\Pokec_Messenger\ver.beta
\Pokec__Messenger\console\Program.cs 35 27 console
什么是正确的实施。感谢您的建议
答案 0 :(得分:3)
您的Avatar.Cred
属性类型为Account
,而非IAccount
...但LogOn
声明只返回IAccount
。所以它可以返回一些其他IAccount
实现 - 编译器不会让你假设IAccount
将是一个没有显式强制转换的帐户。
选项:
Cred
属性的类型更改为IAccount
而不是Account
。这可能是最好的,因为它减少了Avatar
和Account
之间的耦合,因此您可以使用IAccount
的其他实现。LogOn
的返回类型更改为Account
而不是IAccount
。这会将LogOn
API 与Account
联系起来,而不仅仅是实现。分配属性时进行投射:
avatar.Cred = (Account) LogOn();
答案 1 :(得分:2)
public class Avatar
{
public IAccount Cred { get; set; }
}