2009-08-23 3 views

ответ

27

Эта функция называется ковариацией возвращаемого типа. C# не поддерживает его по следующим причинам:

1) CLR не поддерживает его. Чтобы заставить его работать на C#, нам нужно просто наплевать целую кучу маленьких вспомогательных методов, которые будут отличать правильный тип возвращаемого значения. Ничто не мешает вам сделать это самостоятельно.

2) Андерс считает, что ковариация возвращаемого типа не является хорошей языковой функцией.

3) \ У нас есть много высших приоритетов для языка. У нас ограниченные бюджеты, поэтому мы стараемся делать только самые лучшие функции, которые могут быть доступны в любом выпуске. Конечно, это было бы неплохо, но достаточно легко сделать это самостоятельно, если захочешь. Лучше, чтобы мы тратили время на добавление функций, которые улучшают опыт разработчика или добавляют больше репрезентативной власти на язык.

+0

достаточно справедливо :), спасибо за ответ. –

+7

Знаете ли вы, есть ли какая-либо дополнительная информация о №2? Мне нравится читать о таких языковых проблемах. :) –

+0

Ответ Брайана Гидеона на этот вопрос дает пример того, как сделать # 1. –

5

Подписи должны соответствовать точному указанию интерфейса. Нет причин, по которым вы не можете вернуть экземпляр X из метода, но подпись метода должна будет использовать IB.

Что касается разумной причины, то это, вероятно, предпочтительнее с точки зрения удобочитаемости кода.

Вы можете реализовать интерфейс явно и предоставить альтернативную подпись, которая возвращает X, которая не определена интерфейсом. Если вы знаете, что ваш IA на самом деле X, вы можете использовать это вместо этого.

3

Потому что C# не поддерживает co и contravriance для интерфейсов во время компиляции. Таким образом, реализация метода IA.Test() должна точно соответствовать его объявлению. Вы можете, однако, вернуть экземпляр X во время выполнения

1
public X test(); 

Вы должны объявить тело для всех методов в любом классе, это не абстрактный.

Попробуйте это:

class X : IA, IB 
{ 
    public IB test() 
    { 
     return new X(); 
    } 
} 

interface IA 
{ 
    IB test(); 
} 
interface IB { }; 
15

Вы можете использовать явную реализацию интерфейса, чтобы избежать этой проблемы.

+0

+1 для обеспечения работы вокруг. Благодаря! –

1

Это может помочь http://geekswithblogs.net/abhijeetp/archive/2010/01/10/covariance-and-contravariance-in-c-4.0.aspx Вы можете использовать «из» ключевое слово

+2

Эта функция для C# 4.0 поддерживается только для общих интерфейсов и делегатов. Это не работает, как указано в примере вопроса, где IA не является общим интерфейсом, а хорошей находкой. См. Http://msdn.microsoft.com/en-us/library/dd233059.aspx. –

Смежные вопросы