Generic компилирует ошибку в С# (но работает в VB.NET)

У меня странная проблема с дженериками. Я получаю следующие ошибки компиляции:

Наилучшее перегруженное совпадение метода имеет некоторые недопустимые аргументы

Аргумент '1': не может преобразовать из 'EntityBase' в 'T'

Ошибка в EntityWrapper.DoSomethingElse, см. Ниже:

public abstract class EntityBase
{
 public static bool DoSomething<t>(T entity, string someArg) where T : EntityBase
 {
 // implementation doesn't matter
 return true;
 }
}

public class EntityWrapper<t> where T : EntityBase
{
 private EntityBase _entity;

 public void DoSomethingElse()
 {

 EntityBase.DoSomething<t>(_entity, "some arg"); // <--- error here ---
 }

}
</t></t></t>

У меня версия VB.NET этого кода, которая компилируется и выполняется просто отлично, поэтому я ожидаю, что она будет работать на С#.

Что мне здесь не хватает?

Наконец, хотя это не имеет значения, но это VS2008,.NET 3.5.

3 ответа

Позвольте мне показать вам, почему ваш код недействителен. Представьте, что я создаю EntityWrapper, где ******** происходит из BaseEntity:

var myWrapper = new EntityWrapper<********>();
</********>

Что происходит внутри EntityWrapper? Эта:

EntityBase.DoSomething<t>(_entity, "some arg");
</t>

становится

EntityBase.DoSomething<********>(_entity, "some arg");
</********>

что недопустимо: DoSomething ожидает, что ******** первым аргументом, но вы передадите BaseEntity. Это то, что ошибка Argument '1': cannot convert from 'EntityBase' to 'T'.

Как это исправить? В EntityWrapper объявите _entity следующим образом:

private T _entity;

Это позволяет сохранить значение _entity статически _entity в конкретный подтип BaseEntity.


Просто опустите . Вывод типа определит это:

EntityBase.DoSomething(_entity, "some arg");


Возможно, вы могли бы вызвать метод следующим образом:

EntityBase.DoSomething<entitybase>(_entity, "some arg");
</entitybase>

Компилятор не может _entity (который является EntityBase) в T (который указан в вызове метода).

licensed under cc by-sa 3.0 with attribution.