Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Implementing an interface

I'm confused about the implementation of interfaces.

According to MSDN ICollection<T> has the property IsReadOnly

-And-

According to MSDN Collection<T> implements ICollection<T>

-So-

I thought that Collection<T> would have the property IsReadOnly.

-However-

Collection<string> testCollection = new Collection<string>();
Console.WriteLine(testCollection.IsReadOnly);

The above code gives the compiler error:

'System.Collections.ObjectModel.Collection<string>' does not contain a definition for 'IsReadOnly' and no extension method 'IsReadOnly' accepting a first argument of type

'System.Collections.ObjectModel.Collection<string>' could be found (are you missing a using directive or an assembly reference?)

-While-

Collection<string> testInterface = new Collection<string>();
Console.WriteLine(((ICollection<string>)testInterface).IsReadOnly);

The above code works.

-Question-

I thought classes implementing interfaces had to implement every property, so why doesn't testCollection have the IsReadOnly property unless you cast it as ICollection<string>?

like image 507
jemartin80 Avatar asked Dec 12 '22 12:12

jemartin80


1 Answers

It is probably implementing the property explicitly.

C# enables you to define methods as "explicitly implemented interface methods/properties" which are only visible if you have a reference of the exact interface. This enables you to provide a "cleaner" API, without so much noise.

like image 193
D.R. Avatar answered Dec 24 '22 01:12

D.R.