Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 14 Next capture
2021 2022 2023
2 captures
13 Jun 22 - 14 Jun 22
sparklines
Close Help
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
avatar image
0
Question by Skydive · Sep 15, 2013 at 03:03 AM · interfaceforeachcastinterfaces

[C#] Calling Interface from Array of MonoBehaviour

Cannot cast from source to destination type.

Occurrence at second line of code sample underneath. -> foreach(IPauseable I in MB) <-

 MonoBehaviour[] MB = GameObject.FindObjectsOfType(typeof(MonoBehaviour)) as MonoBehaviour[];
 foreach(IPauseable I in MB)
 {
     I.Pause(true);
 }

Interface looks like this:

 public interface IPauseable
 {
     void Pause(bool bPaused);
 }

Not entirely sure why this error is occurring. Thanks in advance.

Comment
Add comment
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

2 Replies

· Add your reply
  • Sort: 
avatar image
0
Best Answer

Answer by ArkaneX · Sep 15, 2013 at 09:18 PM

The problem is you're retrieving all the active MonoBehaviours in the scene, but I bet only some of them implement IPauseable. When foreach encounters one which does not implement this interface, an exception is thrown.

To achieve what you want, I suggest selecting valid MonoBehaviours using LINQ. Change your foreach line to:

 foreach (IPauseable I in MB.Where(x => x is IPauseable))

Where method is LINQ extension from System.Linq namespace, so this requires adding

 using System.Linq;

at the top of your script.

Comment
Add comment · Show 2 · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image Skydive · Sep 15, 2013 at 09:22 PM 0
Share

Thank you very much!

avatar image Jamora · Sep 15, 2013 at 09:29 PM 0
Share

If you don't want to use the LINQ namespace, an alternative to using LINQ is the following:

 foreach($$anonymous$$onoBehavior I in $$anonymous$$B){
     if(I is IPauseable){
         IPauseable temp = (IPauseable)I;
         //possibly you might have to have cast to System.Object first...
         //(IPauseable)((System.Object)I)
         //do whatever
     }
 }
avatar image
1

Answer by vexe · Sep 15, 2013 at 03:22 AM

Not sure why you would expect it to work. See here.

A "Cannot cast from source to destination type" is well... an invalid-cast error. In other words, you're trying to reference an incorrect type into a type-restricted variable.

You're saying foreach (IPauseable I in MB) - it's like saying foreach (int i in myStrings)

The general syntax of a foreach:

 foreach (Type t in TypeCollection)

What comes after the in should either be a collection of '`Type`'s, like:

 foreach (string s in myStrings)

Or, if you got inheritance going on, let's say you have an Enemies array, and you had a Zombie type of enemy, you could say:

 foreach (Zombie z in Enemies)

This is valid because a Zombie 'is an' Enemy.

Notice that interfaces can inherit from other interfaces, but not other classes (you can't have your IPauseable inherit MonoBehaviour)

So you're iterating over something that isn't an IPausable. How can you fix this? - You could create a separate class that inherits from MonoBehaviour and implements your IPausable.

 class MB : MonoBehaviour, IPausable { // goodies... }

Now you can do:

 foreach (IPausable p in MBCollection)
    // do stuff

Where MBCollection is a sequence of MB (array, list, etc) This is now valid because every element of MBCollection '`is`' indeed an IPausable because MB implements IPausable.

[2]: http://msdn.microsoft.com/en-us/library/ttw7t8t6%28v=vs.90%29.aspx

Comment
Add comment · Show 1 · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image Skydive · Sep 15, 2013 at 07:56 PM 0
Share

I still do not understand. I have the array of $$anonymous$$onobehaviours from. $$anonymous$$onoBehaviour[] $$anonymous$$B = GameObject.FindObjectsOfType(typeof($$anonymous$$onoBehaviour)) as $$anonymous$$onoBehaviour[];

And i'm looping through them for the ones which inherit IPauseable. Won't what your doing give a cast error too? :/

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this Question

Answers Answers and Comments

18 People are following this question.

avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image

Related Questions

Derives from MonoBehaviour or Component or is an interface. Error 2 Answers

All interfaces in one Script 1 Answer

Getting a slider's width to match the size of the group it's in? 1 Answer

storing scripts that implements an interface 0 Answers

Coalesce all classes implementing a specified interface into a static list? 1 Answer


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges