На данный момент единственным ограничением является то, что TSomeClass
является классом, поэтому если вам нужно создать экземпляр GenericClass
с типом, который не является SomeClass
, или с типом, который происходит от него, return SomeClass.SomeClassStaticInstance;
явноне будет работать.
Например:
var genericClass = new GenericClass<SomeRandomClass>(); // fine
var randomClass = genericClass.SomeMethod(new SomeRandomClass()); // not fine, a SomeClass is returned!
Я не уверен, куда в данный момент вписывается IInterface
?
Может быть, вы хотите SomeMethodвернуть объект, который реализует IInterface
;если это так, вам нужно дополнительно ограничить свой универсальный тип, и ваш метод должен вернуть IInterface
:
public class GenericClass<TSomeClass> where TSomeClass : class, IInterface
{
public IInterface SomeMethod(TSomeClass someClass = null)
{
return SomeClass.SomeClassStaticInstance; //This now compiles!
}
}
Что касается того, почему return SomeClass.SomeClassStaticInstance as TSomeClass;
работал изначально, это было просто совпадение.
as
- безопасный оператор приведения, который возвращает null
, если попытка приведения не удалась. Поскольку вы TSomeClass
ограничены классом, возвращаемое значение null
будет допустимым. Однако вы всегда будете возвращать null
, если указанный вами общий тип не будет SomeClass
.